簡體   English   中英

如何在兩個不同的線程上等待一項任務?

[英]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!!!!!永遠不會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鍵,則會看到“線程2已結束!!!!!!” 在應用程序關閉之前等待一秒鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM