我想在异步任务成功完成时运行一些代码。
通过阅读网络上的文档和示例,我认为我可以使用Task.ContinueWith
和指定TaskContinuationOptions.OnlyOnRanToCompletion
.
但是,这并不像我预期的那样。
以下代码是在 Visual Studio 2012、.Net 4.5 中创建的控制台程序:
using System;
using System.Threading.Tasks;
namespace TaskContinueTest
{
class Program
{
static void Main(string[] args)
{
var jobTask = Task.Factory.StartNew(() => { });
jobTask.ContinueWith((task, options) =>
{
Console.WriteLine("Completed handler. Task status is {0}", task.Status);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
jobTask.ContinueWith((task, options) =>
{
Console.WriteLine("Faulted handler. Task status is {0}", task.Status);
}, TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
}
}
}
运行时,我得到输出:
Completed handler. Task status is RanToCompletion
Faulted handler. Task status is RanToCompletion
这非常令人惊讶(至少对我而言)。为什么要安排两个延续?
如果我在 中抛出异常,我会得到相同的行为jobTask
,但现在的输出是:
Completed handler. Task status is Faulted
Faulted handler. Task status is Faulted
所以框架清楚地知道了任务的状态,但是为什么两个continuations都还在调度呢?