[英]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.