C# 如何在另一个异步方法中创建调用异步方法而不使其暂停
我需要调用多个异步方法,并且在其中调用另一个异步方法。 让我示范一下C# 如何在另一个异步方法中创建调用异步方法而不使其暂停,c#,winforms,.net-4.5,async-await,C#,Winforms,.net 4.5,Async Await,我需要调用多个异步方法,并且在其中调用另一个异步方法。 让我示范一下 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
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);
}
private async void按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<100;i++)
{
等待方法1();
}
}
公共异步任务方法1()
{
等待任务。延迟(3*1000);
等待方法2();
}
公共异步任务方法2()
{
等待任务。延迟(10*1000);
}
我的问题是,for语句只在wait-on-Method2启动之后激活迭代,我想要的是一次创建100个任务。其他所有操作都将异步完成。不要在for循环中创建每个任务时等待它,而只想启动所有任务。您不想将下一个任务的日程安排推迟到上一个任务完成时,所以不要等待:
private void button1_Click(object sender, EventArgs e)
{
for(int i = 0; i< 100; i++)
{
var task = Method1();
}
}
我想你不明白“等待”是什么意思。“wait”的意思是“开始异步处理这件事,当这件事慢慢过去时,返回windows消息循环并继续处理消息,以便UI继续重新绘制。异步任务完成后,从我等待的地方提取代码” 所以当你在这样的循环中等待时,你是在说:
- 启动第一个异步作业
- 当它运行时,继续处理消息循环
- 当第一个异步作业完成时
- 在我们等待的环路中拾取。我们绕着圈子走
- 启动第二个异步作业
如果这不是你想要的,那么不要等待任务。如果您想启动一百个并发运行的任务,那么就启动一百个任务,不要等待它们中的任何一个。为什么单击处理程序中有等待?我认为您几乎应该总是
等待任务。对于您的第一个代码片段,如果Method1()
中存在未经处理的异常,它将悄无声息地消失,我认为这是一件非常糟糕的事情。您的回答让我找到了解决方案,尽管它与您所说的不完全一样。Thanks@svick有很多处理异常的方法。如果你不知道你打算做什么,如果一个被抛出,很难提出一个解决方案。您可以添加一个onerror continuation,您可以确保在Method1
中处理错误,而不是从调用者处处理错误(如果需要,用另一个方法包装它以处理异常),等等@jure为什么要这样做?该方法是异步的,因此并行启动它不可能给您带来任何性能改进。@Svick我对并行编程不是很有经验。从来没有需要使用大量的并行处理,所以这是我更多的问题。像Servy在一个for循环中建议的那样启动100个任务与使用Parallel启动它是一样的吗?如果您不等待任务
(或以其他方式处理其结果),则执行async
方法期间发生的任何异常都将被静默忽略。
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
}