2017-10-04 18 views
-1

未定義のDLLを使用しており、COMポートなどの未定義のリソースを使用できます。 一部のDLLメソッドには独自のタイムアウトがないため、実行スレッドを強制終了させて​​しまいます。 スレッドがCOMポートなどのリソースを使用していて、スレッドを中止した場合、私のプログラムは "セーフハンドルが閉じられました"というエラーでクラッシュします。私はなぜこれが起こるのか知っていますが、実際のクラッシュではなく、この例外をキャッチするかスキップする方法がありますか?"安全ハンドルが閉じられました"スレッド中止:プログラムのクラッシュを回避できますか?

+2

何がdllですか?中断スレッドは最後の手段ですが、クラッシュのチャンスはコストです。おそらく[DLLを別の 'AppDomain'(https://stackoverflow.com/q/88717/1997232)にロードして中止する代わりにアンロードすることを試みることができますか? – Sinatr

+0

dllが不明です!! 別のAppDomainに関する興味深いアイデア、私はそれを調べようとしています – humudu

答えて

0

解決策: 別のAppDomainでコードを実行すると、コメント内のSinatrのおかげで例外がクラッシュし、クラッシュします。

コード例。 (クラッシュしたことがない)

https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharpに触発さ
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); 
} 

:前には、後

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); 
} 

を(クラッシュしました)。 これで変数を渡すだけでいいです。

関連する問題