IDisposable和Task.WaitAll等待自己

时间:2019-03-10 11:48:47

标签: c# .net task-parallel-library idisposable

我有一个类,该类使用Task.Run生成多个工作任务,并将对这些任务的引用放入集合中。此外,该类实现IDisposable以进行清理。在Dispose()的实现中,我使用Task.WaitAll(_listOfTasks)等待所有工作人员完成。

现在有可能发生,Dispose()的调用来自其中一个工作任务,这显然会导致死锁,因为WaitAll正在等待自身。

是否存在解决此情况的模式或推荐方法? 还是有其他方法可以确保在处置此类时完成所有正在运行的任务?

public class Loader : IDisposable
{

    private readonly IList<Task> _runningTasks = new List<Task>();

    public Loader()
    {
    }

    public void Dispose()
    {
        Task.WaitAll(_runningTasks.ToArray());
    } 

    public void StartLoadAsync()
    {
        var task = Task.Run(() => DoSomeWork());

        _runningTasks.Add(task);         
    }

    void DoSomeWork()
    {
        // after doing some actual work here, call Dispose() in certain cases
        if (SomeCondition)
        {
            Dispose();
        }
    }
}

0 个答案:

没有答案