sim*_*mas 3 c# winforms async-await .net-4.5
我需要调用多个异步方法,并在其中调用另一个异步方法.让我来证明一下
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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,for语句只在Method2启动等待后激活迭代,我想要的是一次创建100任务.其他一切都将异步完成.
我觉得你对"等待"意味着什么感到困惑."await"意味着"开始异步处理这个东西,当它正在消失时,回到windows消息循环并继续处理消息,以便UI继续重新绘制.当异步任务完成时,拿起我等待的代码".
所以当你await在这样的循环中,你说:
如果这不是你想要的,那么就不要等待任务了.如果要启动一百个并发运行的任务,则启动一百个任务,不要等待其中任何一个任务.为什么在点击处理程序中有任何等待?
您只想启动所有任务,而不是await在 for 循环中创建每个任务时 -ing。您不想将下一个任务的安排推迟到上一个任务完成之前,所以不要await:
private void button1_Click(object sender, EventArgs e)
{
for(int i = 0; i< 100; i++)
{
var task = Method1();
}
}
Run Code Online (Sandbox Code Playgroud)
完毕。
如果在所有任务完成后执行某些操作很重要,同时仍然并行执行所有任务,那么您可以依赖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
}
Run Code Online (Sandbox Code Playgroud)