2014-10-03 8 views
5

Na podstawie wszystkich przeczytanych przeze mnie metod należy przejść test. Próbuję zrozumieć, dlaczego zawodzi. Pierwsza assert w prywatnej asynchronicznej metodzie przebiega zgodnie z oczekiwaniami. Jednak gdy zadanie zostanie zwrócone i czeka. Wartość ustawiona w CallContext jest teraz pusta po pobraniu.Wartości logicznych wartości połączeń CallContext nie płyną z wykorzystaniem asynchronicznych zadań

[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"); 

      }); 
    } 

Odpowiedz

9

Metody ozdobione kluczowym async stworzyć kontekst dziecko po nazwie. Wszelkie zmiany dokonane w tym kontekście podrzędnym nie są propagowane do kontekstu nadrzędnego.

W ten sposób PerformSimpleAsyncWork otrzymuje kontekst podrzędny, który może zobaczyć wszystko, co zostało wprowadzone do kontekstu przez wywołującego, ale wszelkie wprowadzone przez niego zmiany nie będą dostępne dla osoby dzwoniącej (LogicalCallContextBlockingTest).

Stephen Cleary ma good writeup w sprawie tego zachowania, jeśli chcesz uzyskać więcej informacji.

+0

Wspaniale, teraz to rozumiem. Dzięki! –