异步等待流

本文关键字:等待 异步 | 更新日期: 2023-09-27 18:19:21

只是确认一下我是否做对了,因为我找不到一个明确的答案:

private async void button_click()
{
    await DoWork();
    Textbox.Text = "Hello World";
}
private async void button_click()
{
    var ret = await DoWork();
    Textbox.Text = "Hello World";
}
private async Task<int> DoWork()
{
     int ret = 0;
     ret = await WriteToDiskAsync();
     return ret;
}

如果我把async方法的返回值赋给一个变量,我100%肯定文本框。文本赋值是在DoWork() 完成之后完成的,即使后面的内容不使用ret变量。而在第一个例子是不确定是否文本框。文本分配是在DoWork()完成后完成的,因为UI线程没有挂起,流继续,所以根据DoWork()和调度器的工作量,任何事情都可能发生。

我以为await在自然语言中的意思是…等一下,但不是那样的

异步等待流

如果我把async方法的返回值赋给一个变量,我100%肯定文本框。文本赋值在DoWork()完成后完成,即使后面的代码不使用ret变量。而在第一个例子是不确定是否文本框。文本的任务是完成DoWork()完成之后,因为UI线程不是暂停和继续,所以根据工作量DoWork()和调度器任何事情都有可能发生。

赋值与控制流无关。await是"产生"线程的东西,在这两种情况下,async方法只有在DoWork完成后才继续执行。(从技术上讲,在这两种情况下,async方法只在DoWork 返回的任务完成后继续执行)。

From my comment

@Alberto在您的两个示例处理程序文本中只在do work任务完成(您也可以只使用task而不使用。如果你不想返回任何东西,只希望能够等待方法)

然而,我看到了一个可能的问题与代码,如果你的方法:

private async Task<int> DoWork()
{
     //Unknown code
}

不包含任何等待在编译器会希望你,它将同步运行,所以它实际上应该阻塞你的线程在我看来。

我错得很严重,所以我把它划掉了,以免让其他人感到困惑。

如果不能异步运行,请尝试使用以下代码:)

private async Task DoWork()
{
     //awaits 1 millisecond to trick the method to be really asynchronous
     await Task.Delay(1);
}