async / await configureawait行为和上下文

时间:2017-05-20 22:02:22

标签: vb.net async-await

想要确认与他ConfigureAwait相关的内容。默认情况下,我读取的Configureawait设置为true。但是它可以设置为false。有些人说when it's true (default) then all code after await将运行within context,如果设置为false,则不会。因此,根据示例,如果我将其设置为false,则DoIndependentWork将无法写入控件,除非我执行Dispatcher,因为在这种情况下它不会在UI线程上的上下文上运行,如果为true,它将会。这是正确的思考吗? So generally saying when false is set all after await will not be running on main thread (not within context) so for example access to the controls will be not possible (unless dispatcher of course)。这样对吗?我曾经把它想象成如果它是WIndows表单,那么上下文是UI线程,所以简单地说如果我设置为false意味着它将无法访问控件,如果为true它将起作用。这一切都在思考吗?那控制台应用程序/ Windows服务怎么样,它的上下文是什么,我设置的是真还是假真的很重要吗?

 Async Function AccessTheWebAsync1() As Task(Of Integer)
        Dim getStringTask As Task(Of String) = New HttpClient().GetStringAsync("http://msdn.microsoft.com")

        Dim urlContents As String = Await getStringTask.ConfigureAwait(false)

        DoIndependentWork()

        Return urlContents.Length
    End Function

    Sub DoIndependentWork()

        If ResultsTextBox.Dispatcher.CheckAccess() Then
            Write()
        Else
            ResultsTextBox.Dispatcher.Invoke(New Action(AddressOf Write))
        End If

        'ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub

1 个答案:

答案 0 :(得分:2)

我建议您阅读我的async intro帖子。它回答了你的问题。

  

有些人说当它是真的(默认)时,await之后的所有代码都将在上下文中运行,如果设置为false则不会。

几乎是真的。引用我的介绍:

  
    

Await就像一个一元的运营商:它需要一个参数,一个等待......等待检查等待它是否已经完成;如果等待已经完成,那么该方法就会继续运行(同步,就像常规方法一样)。

         

如果await发现等待未完成,则它异步行动...如果您正在等待内置等待(例如任务),那么异步方法的其余部分将执行在await返回之前捕获的“上下文”。

  

因此,仅在以下情况下捕获上下文:

  1. await / Task
  2. Task<T>
  3. 该任务尚未完成。
  4. 如果这两个都为真,则捕获上下文(默认情况下)。

      

    如果它是WIndows表单,则上下文是UI线程,所以简单地说如果我设置为false意味着它将无法访问控件,如果为true则它将起作用。

    该“上下文”为SynchronizationContext.Current,除非它是null,在这种情况下它是TaskScheduler.Current

    这通常表示UI上下文,ASP.NET请求上下文或线程池上下文。引用我的介绍:

      
        

    究竟是什么“背景”?简单回答:如果你在UI线程上,那么它就是一个UI上下文。如果您正在响应ASP.NET请求,那么它是一个ASP.NET请求上下文。否则,它通常是一个线程池上下文。

      
         

    那么控制台应用程序/ Windows服务,它的上下文是什么,我设置的是真还是假真的很重要吗?

    由于这些环境不提供自定义SynchronizationContext或自定义TaskScheduler,因此它们使用线程池上下文。因此,无论您是否使用ConfigureAwait(false)都无关紧要。