-1

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?

humudu
  • 699
  • 1
  • 7
  • 13
  • 2
    What dll? Aborting thread is last resort, the crash chance is the cost. Could you perhaps try to [load dll into another `AppDomain`](https://stackoverflow.com/q/88717/1997232) and unload it instead of aborting? – Sinatr Oct 04 '17 at 10:15
  • the dll is unknown!!. interesting idea about another AppDomain, i'm trying to look into it – humudu Oct 04 '17 at 11:42

1 Answers1

0

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.

rene
  • 41,474
  • 78
  • 114
  • 152
humudu
  • 699
  • 1
  • 7
  • 13