c# - 使用异步运行多个方法

标签 c# asp.net asp.net-mvc asynchronous

假设我有这段代码:

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 intro这应该有所帮助。

First question is are they running asynchronously or not?

不,你真的不需要在 Stack Overflow 上问这个问题,因为编译器本身会给你一个警告,明确说明你的方法将同步运行。

Second question is how do I make sure they're running async and to know when they're finished?

首先,您的方法需要正确异步:

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);
}

Third, when I call Init() elsewhere, can it not be wrapped by an async method?

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

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

请注意,这确实要求调用方是异步

同时推荐阅读:我的Best Practices for Asynchronous Code MSDN article ,特别是关于“避免异步无效”和“始终异步”的部分。

关于c# - 使用异步运行多个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26171904/

相关文章:

c# - 如何从同一个解决方案中读取另一个项目的配置值?

c# - 在 2 个监视器上最大化 WPF 窗口

c# - 使用 CF 3.5 添加根证书

c# - 查看我的网页的人数

.net - 从内联代码调用原始 Page_Load 函数

c# - IoC 和 ASP.NET MVC Controller

c# - 具有特殊字符的正则表达式嵌套结构

c# - 您应该对私有(private)方法进行 XML 注释吗?

c# - 如何从地址字段更改电子邮件?

c# - 执行 SaveChanges 时排除未修改的字段