异步等待流

时间:2015-10-25 18:57:26

标签: c# asynchronous

如果我说得对,只是确认,因为我无法找到明确的答案:

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()和调度程序的工作量任何事情都可能发生。

我认为等待意味着它在自然语言中意味着什么......等等,但不是那样。

2 个答案:

答案 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);
}