异步等待流
本文关键字:等待 异步 | 更新日期: 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);
}