同步调用异步函数响应更快
Calling asynchronous function synchronously is more responsive
我有一个这样的异步方法:
private async Task TaskAsync()
{
await Task.Run(() => Task.Delay(2000));
}
然后我在按钮单击事件中调用它,我声明如下:
private async void button1_Click(object sender, EventArgs e)
{
await TaskAsync();
MessageBox.Show("Afterwards.");
}
现在,当我单击该按钮时,TaskAsync()
确实在等待,并且在 TaskAsync()
完成执行之前不会显示消息框。但是,当我在click事件中调用TaskAsync()
的时候去掉await
命令,那么执行就立马跳转到了消息框
我是不是做错了什么?这是 async...await 的正常行为吗?
我的项目是.NET Core 5 C# winform 项目。
这里有两个问题。首先,TaskAsync
方法使用 Task.Run
到 运行 另一个 异步方法。那只是浪费了一个线程。它应该只是 :
private async Task TaskAsync()
{
await Task.Delay(2000);
}
如果没有
private Task TaskAsync()=>Task.Delay(2000);
其次,如果没有等待任务,将立即执行。这就是使用 await
的全部要点 - 等待已经执行的异步任务完成 而不会 阻塞调用线程。
原代码等同于:
private async void button1_Click(object sender, EventArgs e)
{
await Task.Delay(2000);
MessageBox.Show("Afterwards.");
}
如果没有await
,Task.Delay()
返回的任务将被忽略并立即显示消息框。
如果想开始一个长时间的操作,例如读取一个大文件,同时显示一条消息,任务可以存储在一个字段中并等待 after对话框关闭:
private async void button1_Click(object sender, EventArgs e)
{
var task=File.ReadAllTextAsync(...);
MessageBox.Show("Reading a file");
var text=await task;
MessageBox.Show("Afterwards.");
}
或
private async void button1_Click(object sender, EventArgs e)
{
var task=Task.Run(()=>SomeBackgroundProcessing(someArgs));
MessageBox.Show("Processing");
var text=await task;
MessageBox.Show("Afterwards.");
}
我有一个这样的异步方法:
private async Task TaskAsync()
{
await Task.Run(() => Task.Delay(2000));
}
然后我在按钮单击事件中调用它,我声明如下:
private async void button1_Click(object sender, EventArgs e)
{
await TaskAsync();
MessageBox.Show("Afterwards.");
}
现在,当我单击该按钮时,TaskAsync()
确实在等待,并且在 TaskAsync()
完成执行之前不会显示消息框。但是,当我在click事件中调用TaskAsync()
的时候去掉await
命令,那么执行就立马跳转到了消息框
我是不是做错了什么?这是 async...await 的正常行为吗?
我的项目是.NET Core 5 C# winform 项目。
这里有两个问题。首先,TaskAsync
方法使用 Task.Run
到 运行 另一个 异步方法。那只是浪费了一个线程。它应该只是 :
private async Task TaskAsync()
{
await Task.Delay(2000);
}
如果没有
private Task TaskAsync()=>Task.Delay(2000);
其次,如果没有等待任务,将立即执行。这就是使用 await
的全部要点 - 等待已经执行的异步任务完成 而不会 阻塞调用线程。
原代码等同于:
private async void button1_Click(object sender, EventArgs e)
{
await Task.Delay(2000);
MessageBox.Show("Afterwards.");
}
如果没有await
,Task.Delay()
返回的任务将被忽略并立即显示消息框。
如果想开始一个长时间的操作,例如读取一个大文件,同时显示一条消息,任务可以存储在一个字段中并等待 after对话框关闭:
private async void button1_Click(object sender, EventArgs e)
{
var task=File.ReadAllTextAsync(...);
MessageBox.Show("Reading a file");
var text=await task;
MessageBox.Show("Afterwards.");
}
或
private async void button1_Click(object sender, EventArgs e)
{
var task=Task.Run(()=>SomeBackgroundProcessing(someArgs));
MessageBox.Show("Processing");
var text=await task;
MessageBox.Show("Afterwards.");
}