2017-10-04 74 views
-1

即时通讯使用未确定的DLL可以使用未确定的资源,如COM端口。 有些DLL方法没有自己的超时,所以我被迫放弃执行线程。 但是,如果线程正在使用诸如COM端口之类的资源,并且我放弃了该线程,则我的程序将崩溃并显示错误“安全句柄已关闭”。我知道为什么会发生这种情况,但是有什么办法可以捕获这个异常或跳过它,而不是真正的崩溃?“安全句柄已关闭”线程中止:是否可以避免程序崩溃?

+2

什么DLL?中止线程是最后的手段,崩溃的机会就是成本。你可能会尝试[加载DLL到另一个'AppDomain'](https://stackoverflow.com/q/88717/1997232)并卸载它而不是中止? – Sinatr

+0

该DLL是未知的。 关于另一个AppDomain的有趣想法,我正在试着研究它 – humudu

回答

0

解决方案: 在单独的AppDomain中运行代码绕过异常和崩溃 - 感谢Sinatr的评论。

代码示例。 (崩溃)之前

Work work = new Work(); 
Thread execThread = new Thread(new ParameterizedThreadStart(work.COM_StartCommand)); 
execThread.Start("COM4"); 

Thread.Sleep(5000); 
execThread.Abort(); 

for (int i = 0; i < 1000; i++) 
{ 
    Console.WriteLine("bump" + i); //crashes around iteration 20 
    Thread.Sleep(1000); 
} 

后:(永不死机)

using (Isolated<Work> isolated = new Isolated<Work>()) 
{ 
    Thread TestThread = new Thread(new ParameterizedThreadStart(isolated.Value.COM_StartCommand)); 
    TestThread.Start("COM4"); 

Thread.Sleep(5000); 
TestThread.Abort(); 
} 

for (int i = 0; i < 1000; i++) 
{ 
    Console.WriteLine("bump" + i); 
    Thread.Sleep(1000); 
} 

灵感来自https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp。 现在我只需要传递变量。