为什么ContinueWith()在上一个任务完成之前启动[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我正在尝试创建一个等待一段时间然后继续执行任务后工作的任务。代码如下所示。如果我在等待时间使用Thread.Sleep(),它会按预期工作。但是,如果我将Thread.Sleep()更改为等待Task.Delay(),则在task1完成之前继续发生。这是怎么发生的?

class Program
{
    static void Main(string[] args)
    {

        Task t1 = Task.Factory.StartNew(async () => await DoSomeVeryImportantWork(1, 3))
                              .ContinueWith((prevTask)=> { Console.WriteLine("post task work!!!"); });

        Console.WriteLine("caller after starting tasks");
        Console.ReadKey();
    }

    static async Task DoSomeVeryImportantWork(int id, int sleeptimeInSeconds)
    {
        Stopwatch stopWatch = new Stopwatch();

        Console.WriteLine($"t{id} is beginning");

        stopWatch.Start();
        //Thread.Sleep(TimeSpan.FromSeconds(sleeptimeInSeconds));
        await Task.Delay(TimeSpan.FromSeconds(sleeptimeInSeconds));
        stopWatch.Stop();

        TimeSpan ts = stopWatch.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
           ts.Hours, ts.Minutes, ts.Seconds,
           ts.Milliseconds / 10);
        Console.WriteLine($"t{id} sleeping time -  " + elapsedTime);
        Console.WriteLine($"t{id} has completed ");
    }

}

预期输出:(如果我使用thread.sleep()而不是task.delay(),这也是输出)

caller after starting tasks
t1 is beginning
t1 sleeping time -  00:00:03.00
t1 has completed
post task work!!!

实际产量:

caller after starting tasks
t1 is beginning
post task work!!!
t1 sleeping time -  00:00:03.01
t1 has completed
c# task task-parallel-library multitasking
1个回答
1
投票

@Steve权利。 await返回一个新的Task - 它等于Task.Factory.StartNew(() => DoSomeVeryImportantWork(1, 3)) ...你有两个选择:

1)使用Task.Run(),它正确处理异步任务:

Task t1 = Task.Run(() => DoSomeVeryImportantWork(1, 3));
// Or
Task t1 = Task.Run(async () => await DoSomeVeryImportantWork(1, 3));

2)不要打电话给Task.Factory.StartNew()。只需调用异步方法,任务就会自动启动:

Task t1 = DoSomeVeryImportantWork(1, 3);
© www.soinside.com 2019 - 2024. All rights reserved.