C# 即使指定TaskContinuationOptions,任务continuations也始终运行
我想在异步任务成功完成时运行一些代码 通过阅读web上的文档和示例,我认为我可以使用C# 即使指定TaskContinuationOptions,任务continuations也始终运行,c#,asynchronous,task-parallel-library,.net-4.5,C#,Asynchronous,Task Parallel Library,.net 4.5,我想在异步任务成功完成时运行一些代码 通过阅读web上的文档和示例,我认为我可以使用Task.ContinueWith并指定TaskContinuationOptions.OnlyOnRanToCompletion 然而,这并不像我预期的那样 以下代码是在Visual Studio 2012、.Net 4.5中创建的控制台程序: using System; using System.Threading.Tasks; namespace TaskContinueTest { class
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
这是非常令人惊讶的(至少对我来说)。为什么这两个延续都安排好了
如果我在jobstask
中抛出异常,我会得到相同的行为,但现在输出为:
Completed handler. Task status is Faulted
Faulted handler. Task status is Faulted
因此,框架清楚地知道任务的状态,但为什么两个继续都仍然是计划的呢?我认为问题在于您无意中调用了
在.NET4.5中有什么不同吗?因为在.NET 4.0中,OP的代码在(2)行
jobstask.ContinueWith((任务,选项)=>
中给出编译错误Delegate'System.Action'不包含两个参数
!
public Task ContinueWith(
Action<Task, Object> continuationAction,
Object state
)
public Task ContinueWith(
Action<Task> continuationAction,
TaskContinuationOptions continuationOptions
)
Task.ContinueWith(task => Console.WriteLine(...),
TaskContinuationOptions.OnlyOnRanToCompletion);