使用async运行多个方法

本文关键字:方法 运行 async 使用 | 更新日期: 2023-09-27 18:25:34

假设我有这样的代码:

public async void Init(){
    init1();
    init2();
    init3();     
}

第一个问题是它们是否异步运行?方法本身是public void而不是async

第二个问题是,我如何确保他们正在运行async,并知道他们何时完成?像这样。。

public async void Init(){
    init1();
    init2();
    init3();     
    await ... all finished
}

第三,当我在其他地方调用Init()时,它可以不被async方法包装吗?就像下面的代码一样,还是必须是async

public async void Init(){
    init1();
    init2();
    init3();   
}
public void doIt(){
  Init();
}

使用async运行多个方法

我有一个async介绍应该会有所帮助。

第一个问题是它们是否异步运行?

不需要,您实际上不需要在Stack Overflow上问这个问题,因为编译器本身会向您发出警告,明确表示您的方法将同步运行。

第二个问题是,我如何确保它们运行异步,并知道它们何时完成?

首先,您的方法需要适当地异步:

async Task init1Async();
async Task init2Async();
async Task init3Async();

然后,您可以让调用者同时调用,然后异步调用等待它们全部完成:

async Task InitAsync() {
  var task1 = init1Async();
  var task2 = init2Async();
  var task3 = init3Async();
  await Task.WhenAll(task1, task2, task3);
}

第三,当我在其他地方调用Init()时,它可以不被异步方法包装吗?

一旦您的InitAsync方法被正确定义为返回Task,就可以使用await:自然消耗它

async Task doItAsync() {
  await InitAsync();
}

请注意,此确实要求调用者为async

还推荐阅读:我的异步代码最佳实践MSDN文章,特别是关于"避免异步无效"answers"一路异步"的部分。

还有一件事可以做,那就是在方法上等待每个方法,以获得每个方法所需的结果。

var task1 = await init1Async();
var task2 = await  init2Async();
var task3 = await init3Async();