簡體   English   中英

澄清等待/異步和任務

[英]Clarification for Await/Async and Task

最近,我開始使用多線程,並且一直在嘗試更好地了解await / async和Task。 我輸入了以下情況:

private void button1_Click(object sender, EventArgs e)
{
    var list = GenerateList();
    progressBar1.Maximum = list.Count ();

    CreateStuff (list));
    MessageBox.Show ("Complete!");
}

async void CreateStuff (List<int> list)
{
    //additional Parameters here used for DoWork()
    await Task.Run (()=>Parallel.ForEach(list, item =>
    {
        DoWork();
        Invoke(new Action(() => progressBar1.PerformStep()));
    }));
    //do something that relies on list
}

我正在嘗試在CreateDocs方法完成后顯示消息框。 一位同行告訴我,可以在CreateStuff()方法中繼續使用await異步,並且仍然等到該方法強制執行后再顯示消息框。 我一直在研究async和Task一段時間,似乎無法弄清楚該如何做。

對我來說,讓button1_Click()使用await async,然后再等待CreateStuff()方法似乎要容易得多。

我的問題是:是否可以在顯示消息框之前繼續在CreateStuff方法中使用await異步,並仍然在button1_Click()中等待CreateStuff()方法的完成?

我假設它與返回Task有關,但是我不太清楚如何繼續執行任務。

任何幫助表示贊賞。 謝謝!

我的問題是:是否可以在顯示消息框之前繼續在CreateStuff方法中使用await異步,並仍然在button1_Click()中等待CreateStuff()方法的完成?

絕對可以-但是您需要先更改CreateStuff的返回類型。 目前,您返回的是void ,這幾乎從來不是一個好主意-實際上僅適用於事件處理程序。 您需要做的就是更改它以返回Task ,然后可以等待它:

async Task CreateStuff (List<int> list)

然后在您的點擊處理程序(也需要異步)中,等待調用它的結果:

await CreateStuff (list);

請注意,尚不清楚CreateStuff的實現是否真的理想。 您不需要為此使用異步方法-您可以擁有:

Task CreateStuff(List<int> list)
{
    return Task.Run(() => Parallel.ForEach(list, item =>
    {
        DoWork();
        Invoke(new Action(() => progressBar1.PerformStep()));
    }));
}

當您可以只返回任務並讓調用代碼等待時,就沒有太多意義可以使用異步方法來創建任務並等待它。 (我懷疑它們在某些方面的行為略有不同,但在這種情況下,沒有任何重要的關系。)

您的問題是async void

您需要將CreateStuff()更改為async Task ,以便可以在呼叫站點上await它。

您僅應將async void用於事件處理程序。

暫無
暫無

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

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