我有一个外部dll,我需要调用一些方法。另外,我希望能够配置执行这些方法的超时,以便在执行时间> config timeout时中止它们。我将这些方法称为不同的任务:
Parallel.ForEach(....
{
Func<object> asyncFucntion = () => DynamicCall(method, paramList);
IAsyncResult ar = asyncFucntion.BeginInvoke(null, null);
if (ar.AsyncWaitHandle.WaitOne(timeout, true))
{
return asyncFucntion.EndInvoke(ar);
}
else
{
//HERE I NEED to stop DynamicCall. Timeout was EXCEEDED
}
});
现在,我有可能获取DynamicCall线程ID并中止它。还有其他方法吗?一种更轻巧的方式?我无法使用取消代码,因为我无法修改外部DLL
谢谢Alex
流产线程(尤其是泳池线程)是一件非常可怕的事情。您可以考虑只让每个asyncFunction
呼叫自然而然地结束,而不会在超时的情况下观察其结果。请参阅"我如何取消不可依赖的异步操作?"
在旁注上,您在此处使用Parallel.ForEach
非常效率,该操作的线程大约是所需的两倍。没有Parallel.ForEach
,它可能看起来像下面,这是一个更好的版本,IMO:
var tasks = methods.Select(method =>
{
Func<object> asyncFunction = () => DynamicCall(method, paramList);
var task = Task.Factory.FromAsync(
(asyncCallback, state) => asyncFunction.BeginInvoke(asyncCallback, state),
(asyncResult) => asyncFunction.EndInvoke(asyncResult),
null);
return Task.WhenAny(task, Task.Delay(timeout)).Unwrap();
});
Task.WhenAll(tasks).Wait(); // or Task.WaitAll();