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
并不意味着"在后台线程上运行此代码"。如果你想了解更多关于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());
}
}