“Safe handle has been closed” Thread abort: can pr

2019-12-16 19:48发布

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条回答
等我变得足够好
2楼-- · 2019-12-16 20:32

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.

查看更多
登录 后发表回答