同步调用异步函数响应更快

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

如果没有awaitTask.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.");
}