超时后中止卡住的方法
Aborting a stuck method after a timeout
我们的程序正在执行来自 DLL 的未知方法。有时这些方法不会处理超时并且永远不会 return 一个值。
因此,我们的Methodinfo.invoke(...)将永远卡在这条线上。
有什么好的方法可以中止我们的方法吗?
我知道我应该 运行 这种异步方法没问题。
根据要求,这里有一些可视化的小例子:
public string startTheDLLMethod(int timeout)
{
var methodinfo = "...";
return methodGettingStuck(methodinfo); //todo, abort this after timeout
}
public string methodGettingStuck(methodinfo)
{
var1 = "";
var2 = "";
methodinfo.Invoke(var1, var2); //Stuck.
}
如评论中所建议,如果在 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(未尝试)。这段代码只是一个例子!您需要注意同时发生超时和成功的情况。所以 Timer 在它执行的那一刻并没有被释放 - 并且可能有更多的竞争条件需要处理。
我们的程序正在执行来自 DLL 的未知方法。有时这些方法不会处理超时并且永远不会 return 一个值。
因此,我们的Methodinfo.invoke(...)将永远卡在这条线上。
有什么好的方法可以中止我们的方法吗? 我知道我应该 运行 这种异步方法没问题。
根据要求,这里有一些可视化的小例子:
public string startTheDLLMethod(int timeout)
{
var methodinfo = "...";
return methodGettingStuck(methodinfo); //todo, abort this after timeout
}
public string methodGettingStuck(methodinfo)
{
var1 = "";
var2 = "";
methodinfo.Invoke(var1, var2); //Stuck.
}
如评论中所建议,如果在 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(未尝试)。这段代码只是一个例子!您需要注意同时发生超时和成功的情况。所以 Timer 在它执行的那一刻并没有被释放 - 并且可能有更多的竞争条件需要处理。