【发布时间】:2014-06-23 06:37:01
【问题描述】:
通常我不会发布带有答案的问题,但这次我想引起人们对我认为可能是一个晦涩但普遍的问题的关注。它是由this question 触发的,从那以后我查看了自己的旧代码,发现其中一些也受此影响。
下面的代码启动并等待两个任务,task1 和 task2,它们几乎相同。 task1 与 task2 的不同之处仅在于它运行一个永无止境的循环。 IMO,这两种情况对于一些执行 CPU 密集型工作的现实场景来说都是非常典型的。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class Program
{
static async Task TestAsync()
{
var ct = new CancellationTokenSource(millisecondsDelay: 1000);
var token = ct.Token;
// start task1
var task1 = Task.Run(() =>
{
for (var i = 0; ; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// start task2
var task2 = Task.Run(() =>
{
for (var i = 0; i < 1000; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// await task1
try
{
await task1;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task1", ex.Message, task1.Status });
}
// await task2
try
{
await task2;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task2", ex.Message, task2.Status });
}
}
public static void Main(string[] args)
{
TestAsync().Wait();
Console.WriteLine("Enter to exit...");
Console.ReadLine();
}
}
}
小提琴is here。输出:
{ 任务 = 任务 1,消息 = 操作已取消。状态 = 已取消 } {任务=任务2,消息=操作被取消。状态=故障}为什么task1 的状态是Cancelled,而task2 的状态是Faulted? 注意,在这两种情况下我都没有通过token 作为Task.Run 的第二个参数。
【问题讨论】:
-
很高兴我的帖子激起了你的疑问。
-
@l3arnon,这是一个很棒的帖子,事实上,事实上,他们俩都是。
标签: c# .net multithreading task-parallel-library async-await