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

Şaf*_*Gür 3 c# task-parallel-library

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

Do().ContinueWith(t => Do())
    .ContinueWith(t => Do())
    .ContinueWith(t => Do());
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

并且_Counter是一个整数字段:

private static int _Counter = 1;
Run Code Online (Sandbox Code Playgroud)

当我跑步时,结果如下:

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

所以我们假设我有一个Task叫做t和一个Action<Task>叫做a.
如果我打电话t.ContinueWith(a),一个应该被称为 牛逼完成,对吧?当一个运行,这应该意味着什么代表牛逼通话已结束.

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

  • Windows 8 RTM
  • .NET Framework 4.5

Kev*_*sse 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());
    }
Run Code Online (Sandbox Code Playgroud)