【问题标题】:Task continuations always run even when specifying TaskContinuationOptions即使指定了 TaskContinuationOptions,任务延续也始终运行
【发布时间】:2013-01-19 20:22:38
【问题描述】:

我想在异步任务成功完成时运行一些代码。

通过阅读网络上的文档和示例,我认为我可以使用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都还在调度呢?

【问题讨论】:

    标签: c# asynchronous task-parallel-library .net-4.5


    【解决方案1】:

    我认为问题在于您不小心拨打了this overload

    public Task ContinueWith(
        Action<Task, Object> continuationAction,
        Object state
    )
    

    你要的是this overload:

    public Task ContinueWith(
        Action<Task> continuationAction,
        TaskContinuationOptions continuationOptions
    )
    

    您只需将 lambda 表达式更改为使用单个参数:

    Task.ContinueWith(task => Console.WriteLine(...),
        TaskContinuationOptions.OnlyOnRanToCompletion);
    

    【讨论】:

    • .NET 4.5 有什么不同吗?因为在 .NET 4.0 中,OP 的代码在 (2) 行 jobTask.ContinueWith((task, options) =&gt; 上给出了编译错误 Delegate 'System.Action&lt;System.Threading.Tasks.Task&gt;' does not take 2 arguments!
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多