我正在尝试管理 Windows 服务的任务列表,因此当我关闭服务时,我可以使用 Task.WaitAll() 方法来阻止服务关闭,直到所有剩余任务完成。例如,我有一个 Run() 方法,它会一直执行到 bool 值更新为止:
public void Run()
{
while (runFlag)
{
if (MaxTasksAchieved)
{
System.Threading.Thread.Sleep(pollingInterval);
}
else
{
taskList.Add(Task.Factory.StartNew(() =>
{
// do stuff
}));
}
}
}
然后在我的 Stop() 方法中,我有以下内容:
public void Stop()
{
runFlag = false;
if (taskList.Count > 0)
{
// wait
Task.WaitAll(taskList.ToArray());
}
else
{
// no wait, great.
}
}
我的问题是如何优雅地让任务在完成执行后从列表中删除自己?我希望任务将其自身从列表中删除,以便在调用 Stop() 时,taskList 仅包含当前正在进行的任务。
最佳答案
如果您想从列表中删除任务,只需添加一个执行此操作的延续:
taskList.Add(task.ContinueWith(t = > taskList.Remove(t)));
但是您可以简单地对所有任务使用 Task.WaitAll
,因为已完成的任务已经完成。
Task.WaitAll(taskList.ToArray());
通过使用任务状态过滤列表,您可以轻松地只等待正在运行的任务
Task.WaitAll(taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToArray());
关于c# - 如何使用任务并行库管理任务列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28468038/