4

Main控制台应用程序的方法中:

Do().ContinueWith(t => Do())
    .ContinueWith(t => Do())
    .ContinueWith(t => Do());

Do是一个返回的方法Task

var source = new CancellationTokenSource();
var token = source.Token;
return Task.Factory.StartNew(() =>
{
    Console.WriteLine("Inside " + _Counter);
    token.WaitHandle.WaitOne(1000);
    Console.WriteLine(_Counter++ + " is done");
}, token);

并且_Counter是一个整数字段:

private static int _Counter = 1;

当我运行时,结果是这样的:

内部 1
1 完成
内部 2
内部 2
内部 2
2 完成
3 完成
4 完成

所以让我们假设我有一个Task被称为t和一个Action<Task>被称为a
如果我打电话t.ContinueWith(a),应该t完成后调用a ,对吗?a运行时,这应该意味着任何委托t调用都已结束。

是什么导致了这个结果?我在这里没有得到明显的东西吗?
我用什么:

  • 视窗 8 RTM
  • .NET 框架 4.5
4

1 回答 1

7

如果我调用 t.ContinueWith(a),应该在 t 完成后调用 a,对吗?

当然。但是由于您的Do函数创建了一个新任务,它会立即完成,从而开始下一个Do. Do从(仅保留 Console.WriteLine 内容)中删除任务创建,它应该可以按预期工作。

    static void Do()
    {
        Console.WriteLine("Inside " + _Counter);
        Thread.Sleep(1000);
        Console.WriteLine(_Counter + " is done");
    }

    static void Main(string[] args)
    {
        Task.Factory.StartNew(Do)
            .ContinueWith(t => Do())
            .ContinueWith(t => Do())
            .ContinueWith(t => Do());
    }
于 2012-09-01T08:09:12.203 回答