我有一个类,该类使用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();
}
}
}