我们的程序正在执行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