如何在两个不同的线程上等待一个任务?

How to await for one task on two different threads?

我可以等待在不同线程上创建的任务吗?例如:

...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...

然后,在另一个线程中:

...
await CurrentIteration;
...
  1. 第二个线程是否会等待Execute方法执行完毕?
  2. 如果可以,我是否可以在第二个线程中出于相同目的重新使用 CurrentIteration,因为我重新 运行

CurrentIteration = Execute(); // returns Task await CurrentIteration;

在第一个线程上?

我试过这段代码:

public class Program
{
    public static void Main(string[] args)
    {
        MainAsync(args).GetAwaiter().GetResult();
    }
    public static async Task MainAsync(string[] args)
    {

        var instance = new SomeClass();
        var task = instance.Execute();
        Console.WriteLine("thread 1 waiting...");
        Task.Run(async () =>
        {
            Console.WriteLine("thread 2 started... waiting...");
            await task;
            Console.WriteLine("thread 2 ended!!!!!");
        });

        await task;

        Console.WriteLine("thread 1 done!!");

        Console.ReadKey();
    }
}


public class SomeClass
{
    public async Task Execute()
    {
        await Task.Delay(4000);
    }
}

但它打印

thread 1 waiting...
thread 2 started... waiting...

然后

thread 1 done!!

但从来没有thread 2 ended!!!!!。这是为什么?我怎样才能做到这一点?谢谢!

您可以 await 从多个线程处理一个任务。正如@Rob 所说,你实际上真的很接近让它工作,你只需要 await 第二个线程。

考虑一下:

    public static async Task MainAsync(string[] args)
    {

        var instance = new SomeClass();
        var task = instance.Execute();
        Console.WriteLine("thread 1 waiting...");
        var secondTask = Task.Run(async () =>
        {
            Console.WriteLine("thread 2 started... waiting...");
            await task;
            Console.WriteLine("thread 2 ended!!!!!");
        });

        await task;

        await secondTask;

        Console.WriteLine("thread 1 done!!");

        Console.ReadKey();
    }

完成等待任务后,在第二个线程上添加等待。

您没有看到指示的原因是因为控制台卡在 ReadKey 方法上,并且在完成之前无法写入任何内容。如果您按下 Enter,您会在应用程序关闭前看到 "thread 2 ended!!!!!" 行一秒钟。