c# - 如何使用任务并行库管理任务列表

标签 c# .net c#-4.0 task-parallel-library

我正在尝试管理 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/

相关文章:

c# - DateTimeOffset 的 WCF 服务引用?不使用 FCL 类型

c# - 服务在手动停止后自动重启

asp.net-mvc-3 - 使用 Unity 容器时,没有为此对象定义无参数构造函数异常

c# - 阐明 C# 扩展方法的优先级

c# - 使用 .net 反射查找共同的祖先类

c# - 关于C#中构造函数的几个问题

c# - 捕获线程未处理的异常

json - 尝试通过方法 'System.Web.Helpers.Json.Decode(System.String)' 访问字段 'System.Web.Helpers.Json._serializer' 失败

wpf - Windows 文件名中不允许使用哪些字符以及如何限制它们在 C# 中键入

c# - 进度条和线程