簡體   English   中英

如何在沒有Task.Result的情況下通過await獲取異步方法的確切結果?

[英]How to get exactly result from async methods via await without Task.Result?

我想嘗試異步和等待,但我有一個慘敗。 我有方法需要異步運行兩個方法(它部分工作)

public void Run()
{
            Task[] tasks = new Task[2];
            tasks[0] = Task.Factory.StartNew(DisplayInt);
            tasks[1] = Task.Factory.StartNew(DisplayString);

            //block thread until tasks end
            Task.WaitAll(tasks);
}

並使用了兩種方法

public async void DisplayInt()
    {
        Task<int> task = new Task<int>(
            () => 10);
        task.Start();
        Console.WriteLine(await task);
    }

    public async void DisplayString()
    {
        Task<string> task = new Task<string>(
           () => "ok" );
        task.Start();
        Console.WriteLine(await task);
   }

通常我得到下一個結果:1)10 ok

或2)確定10

但有時我什么都沒有

如何在不使用task.Result的情況下通過等待獲得異步方法的確切結果,或者它不會發生?

我建議您閱讀一些介紹性文章,例如我自己的async介紹 ,並在我的MSDN文章中了解異步最佳實踐 如果你只是敲打代碼,你最終會遇到很多痛苦。

特別是,您不應該使用Task.Factory.StartNewTask構造函數也不 應該使用 Task.Start ; 並且你應該避免async void (所有鏈接都是我的博客,我詳細解釋了為什么 )。

要回答您的實際問題:

如何在不使用task.Result的情況下通過等待獲得異步方法的確切結果,或者它不會發生?

要從任務中獲取結果,您可以異步等待任務完成(通過await ),也可以同步(阻塞)等待任務完成(通過Result )。 沒有“其他方式”,如果這就是你所要求的。

歡迎來到SO ......

好吧,在你的情況下,兩個任務都需要更多的時間來初始化它們,然后在里面運行方法。 這就是為什么有時第二個任務在第一個任務完成之前完成(如果它在較短的時間內初始化)。 如果您將DisplayString方法更改為:

    public static async void DisplayString()
    {
        Task<string> task = new Task<string>(
            () => { Thread.Sleep(10); return "ok"; });
        task.Start();
        Console.WriteLine(await task);
    }

因為現在DisplayString方法現在需要大約10毫秒來執行它將始終導致:

10    
ok

PS正如Stephen Cleary所指出的,您可以閱讀一些關於async / await基本文章。 我還建議在WinForms項目上測試它,而不是使用Console

暫無
暫無

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

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