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
C# 即使指定TaskContinuationOptions,任务continuations也始终运行_C#_Asynchronous_Task Parallel Library_.net 4.5 - Fatal编程技术网

C# 即使指定TaskContinuationOptions,任务continuations也始终运行

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

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

通过阅读web上的文档和示例,我认为我可以使用
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);