簡體   English   中英

Console程序中的任務和異步

[英]Task and asynchronous in Console program

我剛剛閱讀了控制台項目中的特殊情況。 你能告訴我我的做法是否正確嗎? 那里有兩個工作我不確定我是否應該像在這里一樣使用等待在Task.Run中,如果它是正確的你可以解釋如果我從這里刪除兩個等待會有什么不同。 接下來的問題如果我將從WhenAny刪除.Wait()。 一般來說它是控制台應用程序的正確方法 忘記提出異步Main到目前為止,讓我們談談void。

public class Program
{
  public static void Main()
  {
     //jobs can work in parael not blocking program
     var job0 = Task.Run(async () => await new DoThisAsync().Run());
     var job1 = Task.Run(async () => await new DoThatAsync().Run());

     //Any Independent synchronous work can run meantime jobs
     IndependentSynchronousMethod;

     //We wait on tasks
     Task.WhenAll(job0, job1).Wait();
  }

}

大部分代碼都不需要

此外,如果您使Main async您可以執行以下操作

public static async Task Main()
{
    var job0 = DoThisAsync();
    var job1 = DoThatAsync();

    //Any Independent synchronous work can run meantime jobs
    IndependentSynchronousMethod;

    //We wait on tasks
    await Task.WhenAll(job0, job1)
}

使您的主要異步

Project -> Build -> Advanced - Language Version >= 7.1

其他資源

Task.WhenAll方法

創建將在所有提供的任務完成后完成的任務。

無法在控制台應用程序的“Main”方法上指定“async”修飾符

更新

Arie:要清楚地忘記Async Main

沒有異步簽名,您可以在控制台應用程序中執行此操作。

Task.WhenAll(job0, job1).Wait();

你的代碼錯了,不會編譯。 除此之外,您試圖在任務中包裝async調用,在這種情況下這是多余的。 您正在嘗試創建一個任務來運行任務,而不需要它。

異步簽名默認返回一個任務,只需將它們傳遞給WhenAll

如果我只是在沒有等待的情況下調用Task.WhenAll(job0,job1),程序會在等待之前結束嗎?

調用async方法將返回已啟動的任務。 因此,沒有必要強制它運行的實際代碼。 但是,因為任務已啟動,所以需要等待一些事情,或者在示例中該過程將結束

Task.WhenAll聚合任務時,它不會為你啟動它們,但是如果你不wait它,或者await它,它的自我只是讓控制流程到應用程序的退出

暫無
暫無

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

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