等待异步不起作用.为什么?

Mar*_*rra 2 c# task-parallel-library async-await .net-4.5

当我尝试运行下面的代码时,执行同步操作.为什么?

我收到以下警告......

警告1此异步方法缺少"等待"操作符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.

private async void btProcessa_Click(object sender, EventArgs e)
{
    await ProcessaA();
    await ProcessaB();
}

public async Task ProcessaA()
{
    for (int i = 0; i <= 100; i++)
    {
        pbProcessoA.Value = i;
        Thread.Sleep(500);
    }
}

public async Task ProcessaB()
{
    for (int i = 0; i <= 100; i++)
    {
        pbProcessoB.Value = i;
        Thread.Sleep(500);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 10

async并不意味着"在后台线程上运行此代码".如果您想了解更多信息async,我有一篇介绍性博客文章,MSDN文档很棒,并且有基于任务的异步模式完整指南.

如果要对I/O绑定(或基于事件的)操作进行一些模拟,则应使用Task.Delay而不是Thread.Sleep:

public async Task ProcessaA()
{
  for (int i = 0; i <= 100; i++)
  {
    pbProcessoA.Value = i;
    await Task.Delay(500);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要模拟CPU绑定操作,那么您应该通过以下方式将它们推送到后台任务Task.Run:

public async Task ProcessaA()
{
  for (int i = 0; i <= 100; i++)
  {
    pbProcessoA.Value = i;
    await Task.Run(() => { Thread.Sleep(500); });
  }
}
Run Code Online (Sandbox Code Playgroud)