2017-09-27 71 views
0

我們的程序正在執行DLL中的未知方法。有時這些方法不會處理超時,並且永遠不會返回值。在超時後中止卡住的方法

因此,我們的Methodinfo.invoke(...)將永久卡在這一行上。

是否有任何體面的方式來中止我們的方法? 我明白,我應該可能運行這種方法asyncronious這是沒有問題的。

這裏要求是可視化的一些小例子:

​​
+0

'ThreadAbortException'?請提供[mcve]。 – dymanoid

+0

瞭解更多關於['CancellationTokenSource'](https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(v = vs.110).aspx)。 – Shreevardhan

+0

您是否聲稱CancellationTokenSource能夠在該方法卡住1行時停止該方法 – humudu

回答

3

正如評論我會嘗試,如果像文件句柄是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代碼(沒有嘗試)。這個代碼只是一個例子!您需要注意超時和成功同時發生的情況。所以定時器在執行時不會被丟棄 - 並且可能會有更多的競爭條件需要處理。

+0

它給了一些困難,因爲方法需要返回一個字符串,並接受幾個對象和變量作爲參數,但我的工作。解決方案的工作原理是,中止線程可能會導致問題,但至少我現在可以告訴用戶它不是我的程序,但是這個DLL很糟糕,這是一個目標。謝謝 – humudu

+0

更新:如果該方法使用COM端口等資源,並且中止該線程,則會導致「安全句柄已關閉」錯誤並導致程序崩潰。 但我設法通過在不同的appdomain中執行線程來解決這個問題。 https://stackoverflow.com/questions/46562227/safe-handle-has-been-closed-thread-abort-can-program-crash-be-avoided – humudu