我們的程序正在執行DLL中的未知方法。有時這些方法不會處理超時,並且永遠不會返回值。在超時後中止卡住的方法
因此,我們的Methodinfo.invoke(...)將永久卡在這一行上。
是否有任何體面的方式來中止我們的方法? 我明白,我應該可能運行這種方法asyncronious這是沒有問題的。
這裏要求是可視化的一些小例子:
我們的程序正在執行DLL中的未知方法。有時這些方法不會處理超時,並且永遠不會返回值。在超時後中止卡住的方法
因此,我們的Methodinfo.invoke(...)將永久卡在這一行上。
是否有任何體面的方式來中止我們的方法? 我明白,我應該可能運行這種方法asyncronious這是沒有問題的。
這裏要求是可視化的一些小例子:
正如評論我會嘗試,如果像文件句柄是DLL中分配給不ThreadAbortException
工作建議。
但在這裏你去:
public void BlockingCallWithTimeout()
{
Semaphore waitHandle = new Semaphore(0,1);
Thread thread = new Thread(this.Wrapper);
Timer timer = new Timer(state =>
{
thread.Abort();
waitHandle.Release();
},null,5000,0);
thread.Start(waitHandle);
waitHandle.WaitOne(); //wait until completion or until timeout
timer.Dispose();
}
public void Wrapper(object state)
{
Semaphore semaphore = (Semaphore)state;
//Call DLL Method
semaphore.Release();
}
您需要的地方處理ThreadAbortException代碼(沒有嘗試)。這個代碼只是一個例子!您需要注意超時和成功同時發生的情況。所以定時器在執行時不會被丟棄 - 並且可能會有更多的競爭條件需要處理。
它給了一些困難,因爲方法需要返回一個字符串,並接受幾個對象和變量作爲參數,但我的工作。解決方案的工作原理是,中止線程可能會導致問題,但至少我現在可以告訴用戶它不是我的程序,但是這個DLL很糟糕,這是一個目標。謝謝 – humudu
更新:如果該方法使用COM端口等資源,並且中止該線程,則會導致「安全句柄已關閉」錯誤並導致程序崩潰。 但我設法通過在不同的appdomain中執行線程來解決這個問題。 https://stackoverflow.com/questions/46562227/safe-handle-has-been-closed-thread-abort-can-program-crash-be-avoided – humudu
'ThreadAbortException'?請提供[mcve]。 – dymanoid
瞭解更多關於['CancellationTokenSource'](https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(v = vs.110).aspx)。 – Shreevardhan
您是否聲稱CancellationTokenSource能夠在該方法卡住1行時停止該方法 – humudu