2014-10-03 70 views
5

基於我已閱讀的一切,下面的測試方法應通過。我試圖理解它爲什麼會失敗。私人異步方法中的第一個斷言按預期通過。但是一旦任務返回並等待。在CallContext中設置的值在檢索時現在爲空。邏輯CallContext值不流利使用異步任務

[TestMethod] 
    public void LogicalCallContextBlockingTest() 
    { 
     PerformSimpleAsyncWork().Wait(); 

     var result = CallContext.LogicalGetData("test"); 

     Assert.AreEqual(result, "expected"); 
    }  

    private async Task PerformSimpleAsyncWork() 
    { 
     await Task.Run(() => 
      { 
       System.Threading.Thread.Sleep(100); 
       CallContext.LogicalSetData("test", "expected"); 

       var result = CallContext.LogicalGetData("test"); 

       Assert.AreEqual(result, "expected"); 

      }); 
    } 

回答

9

裝飾有async關鍵字的方法在調用時會創建子上下文。對此子上下文所做的任何更改都不會傳播到父上下文。

因此,PerformSimpleAsyncWork得到一個子上下文,它可以看到調用者放入上下文的任何內容,但它所做的任何更改都不會被調用者使用(LogicalCallContextBlockingTest)。

Stephen Cleary對此行爲有good writeup如果您想了解更多信息。

+0

太棒了,我現在明白了。謝謝! – 2014-10-03 18:07:12