2017-05-20 89 views
0

想確認與他相關的內容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意味着它將無法訪問控件,如果它真的會起作用。這一切都在思考嗎?那麼控制檯應用程序/ windows服務怎麼樣,這是什麼上下文,它真的很重要,我設置true或false?異步/等待configureawait行爲和上下文

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 
+0

why -1?我的問題是否有問題? – Dino

+0

不知道-1它不是我,我不明白爲什麼說實話。不過值得注意的是,你有很多問題有答案,但尚未被標記爲已接受。請參考[遊覽]瞭解網站的工作原理。對於每個接受的答案,您也獲得2個代表。然後你可以看看upvoting這是一種表達感謝的方式。 – Bugs

回答

1

我推薦你閱讀我的async intro的帖子。它回答你的問題。

有些人說,如果它是真的(默認),那麼await之後的所有代碼將在上下文中運行,如果設置爲false,則不會。

差不多。引用我的介紹:

等待就像是一元運算符:它需要一個參數,一個awaitable ......等待檢查該awaitable,看它是否已經完成;如果awaitable已經完成,那麼方法會繼續運行(同步,就像常規方法一樣)。

如果await看到awaitable尚未完成,那麼它將異步執行......如果您在等待內置的可等待任務(例如任務),那麼異步方法的其餘部分將在「上下文「是在await返回之前捕獲的。

所以,上下文只捕獲,如果:

  1. await一個Task/Task<T>
  2. 該任務尚未完成。

如果這兩個都是真的,則會捕獲上下文(默認情況下)。

如果它是WIndows窗體,那麼上下文是UI線程,所以簡單地說如果我設置false意味着它將無法訪問控件,如果它是真的,它將工作。

即 「上下文」 是SynchronizationContext.Current,除非是null,在這種情況下,它是TaskScheduler.Current

這通常意味着UI上下文,ASP.NET請求上下文或線程池上下文。引用我的介紹:

究竟是什麼「背景」?簡單的回答:如果你在一個UI線程上,那麼這是一個UI上下文。如果您對ASP.NET請求作出響應,那麼這是一個ASP.NET請求上下文。否則,它通常是一個線程池上下文。

什麼是控制檯應用程序/ Windows服務,什麼是上下文,它真的很重要,我設置真或假?

由於這些環境不提供自定義SynchronizationContext也不提供自定義TaskScheduler,它們使用線程池上下文。因此,您是否使用ConfigureAwait(false)並不重要。

+0

感謝我閱讀您的博客,並認爲我在這裏寫的是真實的:)只需要記住爲Win窗體/ wpf/asp.net設置false之後等待set asfigure在async方法內等待false將運行否上下文(UI線程),所以意味着例如控制無法訪問(除非我讓調度員)。如果贏得服務/控制檯不重要,不管設置什麼。我認爲我的理解是正確的。 – Dino