Task.ContinueWith在任务完成执行之前运行

时间:2012-09-01 08:06:09

标签: c# task-parallel-library

在控制台应用程序的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 完成后拨打t.ContinueWith(a) 应该被称为,对吧?当 a 运行时,这应该意味着代表 t 调用已经结束。

导致此结果的原因是什么?我在这里没有明显的东西吗? 我用的是什么:

  • Windows 8 RTM
  • .NET Framework 4.5

1 个答案:

答案 0 :(得分:7)

  

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

不确定。但是,由于您的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());
    }