繁体   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