gpt4 book ai didi

c# - 对 Await/Async 和 Task 的说明

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:48 25 4
gpt4 key购买 nike

最近我开始使用多线程,并一直在努力更好地理解 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,并且仍然等到该方法完成后再显示消息框。我一直在研究 await async 和 Task 一段时间,但似乎无法弄清楚如何做到这一点。

对我来说,让 button1_Click() 使用 await async,然后等待 CreateStuff() 方法似乎更容易。

我的问题是:是否可以在CreateStuff方法中继续使用await async,仍然等待button1_Click()中的CreateStuff()方法完成后再显示消息框?

我假设它与返回任务有关,但我不太清楚如何处理它。

感谢任何帮助。谢谢!

最佳答案

My question is this: Is it possible to keep using await async in the CreateStuff method and still wait for the completion of the CreateStuff() method in button1_Click() before displaying the message box?

当然 - 但您需要先更改 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()));
}));
}

当您可以只返回任务并让调用代码等待它时,拥有一个仅用于创建任务并等待它的异步方法并没有多大意义。 (它们在某些方面的行为确实略有不同,但我怀疑在这种特殊情况下并不重要。)

关于c# - 对 Await/Async 和 Task 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com