在长期运行方法上停止任务



我有一个外部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();

相关内容

  • 没有找到相关文章

最新更新