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
}