簡體   English   中英

如何在沒有停止的情況下在另一個異步方法中創建調用異步方法

[英]How can I create call an async method inside another async method without it stalling

我需要調用多個異步方法,並在其中調用另一個異步方法。 讓我來證明一下

private async void button1_Click(object sender, EventArgs e)
{
    for(int i = 0; i< 100; i++)
    {
        await Method1();
    }
}

public async Task Method1()
{
    await Task.Delay(3*1000);
    await Method2();
}

public async Task Method2()
{
    await Task.Delay(10*1000);
}

我的問題是,for語句只在Method2啟動等待后激活迭代,我想要的是一次創建100任務。 其他一切都將異步完成。

我覺得你對“等待”意味着什么感到困惑。 “await”意味着“開始異步處理這個東西,當它正在消失時,回到windows消息循環並繼續處理消息,以便UI繼續重新繪制。當異步任務完成時,拿起我等待的代碼“。

所以當你在這樣的循環中await時,你會說:

  • 啟動第一個異步作業......
  • 當它正在運行時,繼續處理消息循環。
  • 第一個異步作業完成后......
  • 在我們期待的循環中接受。 我們圍繞循環......
  • 啟動第二個異步作業......

如果這不是你想要的,那么就不要等待任務了 如果要啟動一百個並發運行的任務,則啟動一百個任務,不要等待其中任何一個任務 為什么在點擊處理程序中有任何等待?

而不是在for循環中創建它時await每個任務,您只需要啟動所有任務。 您不希望延遲下一個任務的調度,直到上一個完成,所以只是不要await

private void button1_Click(object sender, EventArgs e)
{
    for(int i = 0; i< 100; i++)
    {
        var task = Method1();
    }
}

完成。

如果在完成所有任務后執行某些操作非常重要,同時仍然並行完成所有任務,則可以依賴Task.WhenAll生成將在完成所有其他任務時完成的任務:

private async void button1_Click(object sender, EventArgs e)
{
    var tasks = new List<Task>();
    for(int i = 0; i< 100; i++)
    {
        tasks.Add(Method1());
    }
    await Task.WhenAll(tasks);
    textbox1.Text = "Done!"; //or whatever you want to do when they're all done
}

暫無
暫無

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

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