如何不继续已取消的任务?

4
这里是一个示例代码:

var task = Task.Factory.StartNew(() => { throw new Exception(); });
task.ContinueWith(t => Console.WriteLine("Exception"), TaskContinuationOptions.OnlyOnFaulted);
task.ContinueWith(t => Console.WriteLine("Success"), TaskContinuationOptions.NotOnFaulted)
    .ContinueWith(t => Console.WriteLine("Should not be executed. Task status = " + t.Status, TaskContinuationOptions.NotOnCanceled));
Console.ReadLine();  

输出结果(顺序无关紧要):

异常

不应该执行。任务状态=已取消

为什么第二个ContinueWith被执行了,如何防止它?
2个回答

2
您上次对 ContinueWith 的调用中的括号是错误的。
.ContinueWith(t =>
    Console.WriteLine(
        "Should not be executed. Task status = " + t.Status,
        TaskContinuationOptions.NotOnCanceled));

TaskContinuationOptions.NotOnCanceled作为参数传递给WriteLine

修正后:

.ContinueWith(t =>
    Console.WriteLine(
        "Should not be executed. Task status = " + t.Status),
    TaskContinuationOptions.NotOnCanceled);

是的,你说得对。下次会更加注意。 - Teddy Bo
@TeddyBo 我一开始也没注意到!这只是那些由于函数重载、params object[]参数等而可能悄然产生的微妙问题之一。 - Timothy Shields

1
由于错别字,Ctrl+Shift+F1它。
// ContinueWith([NotNull] Action<Task> continuationAction)
// WriteLine([NotNull] string format, object arg0)
.ContinueWith(t => Console.WriteLine("Should not be executed. Task status = " + t.Status, TaskContinuationOptions.NotOnCanceled));

// ContinueWith([NotNull] Action<Task> continuationAction, TaskContinuationOptions continuationOptions)
// WriteLine(string value) 
.ContinueWith(t => Console.WriteLine("Should not be executed. Task status = " + t.Status), TaskContinuationOptions.NotOnCanceled);

哦,不会吧...这真的只是一个打字错误,它现在可以正确运行。非常感谢你!!! 大家,对不起没有理由打扰你们! - Teddy Bo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接