Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查所有任务是否已正确完成?_C#_Multithreading_.net 4.0_Task_Task Parallel Library - Fatal编程技术网

C# 如何检查所有任务是否已正确完成?

C# 如何检查所有任务是否已正确完成?,c#,multithreading,.net-4.0,task,task-parallel-library,C#,Multithreading,.net 4.0,Task,Task Parallel Library,我的代码中有以下行: var taskA = Task.Factory.StartNew(WorkA); var taskB = Task.Factory.StartNew(WorkB); var allTasks = new[] { taskA, taskB }; Task.Factory.ContinueWhenAll(allTasks, tasks => FinalWork(), TaskContinuationOptions.OnlyOnRanTo

我的代码中有以下行:

    var taskA = Task.Factory.StartNew(WorkA);
    var taskB = Task.Factory.StartNew(WorkB);
    var allTasks = new[] { taskA, taskB };

    Task.Factory.ContinueWhenAll(allTasks, tasks => FinalWork(), TaskContinuationOptions.OnlyOnRanToCompletion);
但是,当我运行此命令时,会出现以下错误:

为多个任务的延续排除特定的延续类型是无效的

这是由选项TaskContinuationOptions.OnlyOnRanToCompletion引起的

我的问题是如何检查所有任务是否正确完成了工作(所有任务状态均为RanToCompletion),然后执行FinalWork()
同时,应用程序会执行其他任务。

您没有提供任何代码来处理运行到完成的任何任务(您的
任务
变量将被忽略)。如果只删除
TaskContinuationOptions.OnlyOnRanToCompletion
,则会得到相同的结果。i、 e.如果您可以将
continuewhall
TaskContinuationOptions一起使用。只有在所有任务完成或失败之前,才会调用您的continuation。如果只对已完成的任务不执行任何操作,则与
Task.Factory.continuewhalll(allTasks,tasks=>FinalWork())相同


如果您想做更具体的事情,请提供详细信息,以便有人能够帮助您。

要回答您提出的实际问题:

我的问题是,如何检查所有任务是否已正确完成工作(所有任务状态均为RANTO完成),然后执行FinalWork()?同时,应用程序执行其他任务

至少这是我读到的问题检查以下代码:

    var taskA = Task.Factory.StartNew(WorkA);
    var taskB = Task.Factory.StartNew(WorkB);
    var allTasks = new[] { taskA, taskB };

    taskA.Wait();
    taskB.Wait();

    if (taskA.Status == TaskStatus.RanToCompletion && taskB.Status == TaskStatus.RanToCompletion)
        Task.Factory.ContinueWhenAll(allTasks, tasks => FinalWork());
    else
        //do something

如果你真的是这个意思的话,你实际上是自己回答了这个问题。

基于@Peter Ritchie和@Ben McDougall的回答,我找到了一个解决方案。我通过删除冗余变量
tasks
TaskContinuationOptions修改了代码。仅限RANTOCOMPLETION

var taskA = Task.Factory.StartNew(WorkA);
var taskB = Task.Factory.StartNew(WorkB);
var allTasks = new[] { taskA, taskB };
Task.Factory.ContinueWhenAll(allTasks, FinalWork);
其中,
FinalWork
是:

private static void FinalWork(Task[] tasks)
{
   if (tasks.All(t => t.Status == TaskStatus.RanToCompletion))
   {
        // do "some work"
   }
}
如果所有
任务
的状态均为
RanToCompletion
“一些工作”将完成。它将在所有任务完成后立即执行,不会阻止主任务。 如果我至少取消一项任务,则不会执行任何操作

或者你可以这样做

var taskA = Task.Factory.StartNew(WorkA);
var taskB = Task.Factory.StartNew(WorkB);
var allTasks = new[] { taskA, taskB };
var continuedTask = Task.WhenAll(allTasks).ContinueWith((antecedent) => { /*Do Work*/ }, TaskContinuationOptions.OnlyOnRanToCompletion));

如果部分
任务
s失败,您想怎么办?如果部分
任务
s失败,则不应采取任何措施。感谢您的回答。不幸的是,此解决方案使用方法
task.Wait
@Zen我在任务声明和等待之间添加了一些任务,这些任务执行得很好。我们的锁定稍后将再次检查您的问题。@Zen:我添加了一个新类并包含一个线程,一切都很好。没有锁,一切都很顺利。我需要更多关于你问题的信息,因为我到目前为止没有任何困难。基本上添加了一个类,该类在构造函数中启动线程并将其添加到任务之前:
code
var taskC=Task.Factory.StartNew(WorkC);JustAnotherThread jt=新的JustAnotherThread();var taskA=Task.Factory.StartNew(WorkA)<代码>代码
是的,你说得对。现在我看到变量
tasks
是冗余的。关于任务状态的所有信息都可以通过变量
allTasks
传递给函数。替代方法似乎是——甚至建议它。