我有这两个场景,但我不理解为什么事情会按照它们发生:
static void Main(string[] args)
{
Console.WriteLine("***Starting T1");
//run two tasks sequentially
Task t = FirstTask().ContinueWith(_ => SecondTask(), TaskContinuationOptions.OnlyOnRanToCompletion);
//register succeded and faulted continuations
t.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
Console.WriteLine("***Starting T2");
Task t2 = FirstTask().ContinueWith(_ => FaultTask(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
Console.WriteLine("***Starting T3");
Task t3 = FirstTask().ContinueWith(ant => ant.ContinueWith(_ => FaultTask(), TaskContinuationOptions.OnlyOnRanToCompletion));
t3.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t3.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
}
private static Task FirstTask()
{
return Task.Run(() =>
{
Console.WriteLine("Task 1");
Thread.Sleep(1000);
});
}
private static Task SecondTask()
{
return Task.Run(() =>
{
Console.WriteLine("Task 2");
Thread.Sleep(1000);
});
}
private static Task FaultTask()
{
return Task.Run(() =>
{
Console.WriteLine("Throw...");
Thread.Sleep(1000);
throw new ArgumentException();
});
}
private static void Completion()
{
Console.WriteLine("Complete");
}
private static void Faulted()
{
Console.WriteLine("Faulted");
}
在第一种情况下,所有任务都按预期运行。但是,如果在
FirstTask()
中移除 Sleep()
,则不能保证按顺序运行任务。在第二种情况下,
Faulted()
处理程序不会运行。我希望它发生,因为出现了未处理的异常。在第三种情况下,异常是在运行
Complete()
处理程序后抛出的。我对这种顺序感到困惑。基本上,我想能够链式连接任意数量的任务,并在前一个任务完成后按顺序运行它们。创建链之后,我将显示等待窗体,并在最终任务(即所有任务完成后)中注册
OnlyOnRanToCompletion
、OnlyOnCancelled
、OnlyOnFaulted
的连续项以关闭窗体-显示成功或错误。这是MSDN所提到的那些选项,它们不适用于多任务连续项的地方吗?
Task.Run()
时,你的任务已经开始了。因此,例如,在代码的第一行中,你同时启动了两个任务。 - Zruty