Async和await不能工作.为什么

本文关键字:工作 为什么 不能 await Async | 更新日期: 2023-09-27 18:14:23

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

我得到以下警告…

警告1此异步方法缺少'await'操作符,将同步运行。考虑使用'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);
    }
}

Async和await不能工作.为什么

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

如果你想模拟cpu限制的操作,那么你应该通过Task.Run:

将它们推到后台任务:
public async Task ProcessaA()
{
  for (int i = 0; i <= 100; i++)
  {
    pbProcessoA.Value = i;
    await Task.Run(() => { Thread.Sleep(500); });
  }
}

我将这个示例编写到一个实际的生产系统中。将实体保存在数据库中可能需要一些时间。看看这个优雅的模拟

class TestAsyncAwait
{
    public void GetEntities()
    {
        for (int i = 0; i < 4; i++)
        {
            var a = getEntities(i);
            saveEntitiesAsync(a);
        }
        Console.WriteLine("'nPress any key to close'n");
        Console.ReadKey();
    }
    private List<string> getEntities(int i)
    {
        Console.Write("getting Entities for id={0}...", i);
        Thread.Sleep(2000);
        var r = new List<string> { i.ToString(), " Hello!" };
        Console.WriteLine("done, has the Entities for id={0}'n", i);
        return r;
    }
    async void saveEntitiesAsync(List<string> a)
    {
        var sb = new StringBuilder();
        await Task.Run(() =>
        {
            Thread.Sleep(4000); // simulates long task
            foreach (string s in a) sb.Append(s);
        });
        // shows the thread in action
        Trace.WriteLine("saved: " + sb.ToString());
    }
}
相关文章: