如果我说得对,只是确认,因为我无法找到明确的答案:
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;
}
如果我将异步方法的返回值分配给变量,我100%确定Textbox.Text分配是在DoWork()
完成之后完成的,即使以下内容不使用ret变量。虽然在第一个示例中不确定Textbox.Text赋值是否在DoWork()
完成后完成,因为UI线程未挂起且流程继续,因此取决于DoWork()
和调度程序的工作量任何事情都可能发生。
我认为等待意味着它在自然语言中意味着什么......等等,但不是那样。
答案 0 :(得分:2)
如果我将异步方法的返回值赋给变量,我100%确定在DoWork()完成后完成Textbox.Text赋值,即使后面的内容不使用ret变量。虽然在第一个示例中不确定是否在DoWork()完成后完成Textbox.Text分配,因为UI线程未被挂起且流程继续,因此根据DoWork()和调度程序的工作量,可能发生任何事情。
分配与控制流无关。 await
是“产生”线程的内容,在这两种情况下async
方法仅在DoWork
完成后才继续执行。 (从技术上讲,在两种情况下,只有在从async
返回的任务完成后,DoWork
方法才会继续执行。
答案 1 :(得分:0)
从我的评论中
@Alberto在两个示例处理程序文本中仅在之后分配 do work任务完成(你也可以只使用没有的任务 int部分,如果你不想返回任何东西,但能够等待 方法)
但是,如果您的方法:
,我已经看到了代码可能出现的问题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);
}