2014-10-03 14 views
5

Aşağıdakileri okuduğum herşeyi temel alan Test yöntemi geçmelidir. Neden başarısız olduğunu anlamaya çalışıyorum. Özel async yöntemindeki ilk iddia, beklendiği gibi geçer. Ancak görev döndükten ve bekledikten sonra. CallContext'te ayarlanan değer, alındığında artık boştur.Mantıksal ÇağrılarContext değerleri, uyumsuzluk kullanarak akmıyor Görevler

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

      }); 
    } 

cevap

9

async anahtar kelimesi ile dekore edilmiş yöntemler Arandığında bir çocuk içeriği oluşturun. Bu alt bağlamada yapılan değişiklikler ana içeriğe yayılmamaktadır.

Böylece PerformSimpleAsyncWork arayan tarafından bağlam içine konulmuştur şey görebileceğiniz bir çocuk bağlamı, ancak arayanın (LogicalCallContextBlockingTest) için kullanılabilir olmayacaktır yapar değişiklikleri alır.

Daha fazla bilgi için Stephen Cleary'nin bu davranış üzerinde bir good writeup vardır.

+0

Harika, şimdi anladım. Teşekkürler! –