2017-09-27 45 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