【问题标题】:Using tasks when they have all completed全部完成后使用任务
【发布时间】:2013-07-16 05:20:44
【问题描述】:

我对 Task.Factory.ContinueWhenAll 方法有疑问

这是我的代码:

private void CheckNewResult(){
    Task.Factory.ContinueWhenAll(TasksList.toArray(),CompleteTasks);
}
private void CompleteTasks(Tasks[] tasks)
{
 if(tasks.Any(t => t.Status == (TaskStatus.RantoCompletion)))
 {
    //do something
 }
}

我的问题是 Complete Tasks 方法实际何时被调用?是不是所有的任务都完成了他们的请求?

【问题讨论】:

    标签: c# parallel-processing task-parallel-library scheduled-tasks task


    【解决方案1】:

    当你这样做时

     Task.Factory.ContinueWhenAll(TasksList.toArray(),CompleteTasks);
    

    文档指出

    创建一个将在一组提供的任务完成后启动的延续任务。处于已完成状态或任何其他状态。

    一种可能的方法是测试任务的状态,并且仅在状态不是“故障”或“已取消”时才尝试执行继续。所以你需要这样做。

     if(tasks.Any(t => t.Status == (TaskStatus.RantoCompletion)))
    

    【讨论】:

    • 好的,我仍然有点困惑,因为我故意这样做了,所以当我执行任务时,两个任务将处于故障状态并在调试器中。任何所有任务都在列表中并且在那里是一些有故障并运行完成的。所以我认为 ContinueWhenAll 与他们的状态无关,因为在调试器中它可以毫无问题地实时传递它?
    • @DeVonte 只需遍历每个任务并调试状态以查看它们的状态。
    • 这个语句的结果是什么 if(tasks.Any(t => t.Status == (TaskStatus.RantoCompletion)))。是真是假?
    • 如果您在底部的窗口中查看,它会显示传递给 Complete Tasks 方法的任务数组,此时仍有一些错误和一些已经完成跨度>
    【解决方案2】:

    根据documentation

    创建一个将在完成时启动的延续任务 一组提供的任务。

    是的,当所有任务完成时调用它。

    【讨论】:

    • 这是否意味着不需要语句:if(tasks.Any .... 因为我们已经知道到那时一切都完成了。
    • @DeVonte:我会说不。
    • @Tigran 他将如何检查所有任务是否已完成?他需要更改语句以检查所有任务的完成情况。
    • @EhsanUllah 我有 task.any 而不是 task.all 的原因是因为我正在使用的程序,有些可能会出现故障。除非你有其他我可以使用的方法。
    • @DeVonte 查看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多