问题
Im using undetermined DLLs which can use undetermined resources such as a COM port. Some DLL methods don't have their own timeouts, so i am forced to abort the execution thread. But if the thread is using a resource such as a COM port, and i abort the thread, my program crashes with the error “Safe handle has been closed”. I know why this happens but is there any way to catch this exception or skip it, rather than an actual crash?
回答1:
Solution: Running the code in a separate AppDomain bypasses the exception and crash - thanks to Sinatr in the comments.
Code example. Before (crashed)
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);
}
After: (never crash)
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);
}
Inspired by https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp. Now I just need to pass around variables.
来源:https://stackoverflow.com/questions/46562227/safe-handle-has-been-closed-thread-abort-can-program-crash-be-avoided