2016-03-06 11 views
9

AsyncLocal, bağlam verilerini bir uyumsuz denetim akışı üzerinde tutmamıza izin verir. Aşağıdaki tüm özgeçmişler (başka bir iş parçacığında bile) ortam verisini (AsyncLocal on MSDN) alıp değiştirebileceğinden, bu oldukça düzgün.C# Async/Await: Görev oluşturma üzerine AsyncLocal <T> bağlamı bırakın

Bir alt görev için geçerli zaman uyumsuz yerel bağlamı 'bırakma' ve böylece yeni bir tane oluşturmanın bir yolu var mı? Yukarıdaki örnekte

AsyncLocal<string> Data = new AsyncLocal<string>(); 
Data.Value = "One"; 

Task.Factory.StartNew(() => 
{ 
    string InnerValue = Data.Value; 
    //InnerValue equals to "One", I need it to be null. 
}); 

iç görev payları dış kontrol akışı ile AsyncLocal bağlamı. Yeni bir bağlamı uygulamak için herhangi bir yolu var mı?

Güncelleme: Sorunumu burada çözmek için aşağıdaki (tamamen bağlamı sıfırlamadıysanız olmasına rağmen) bir cazibe gibi çalıştı:

AsyncLocal<string> Data = new AsyncLocal<string>(); 
Data.Value = "One"; 

Task.Factory.StartNew(() => 
{ 
    Data.Value = null; 
    string InnerValue = Data.Value; 
    //InnerValue equals to null now. 
}); 

string OuterValue = Data.Value; //Stays "one" even after the inner change. 
+1

Sorunuzu anlamıyorum. AsyncLocal'ın tüm amacı, async çağrıları arasındaki değeri aktarabilmektir ve verilerin akmaması mı istiyorsunuz? Öyleyse neden ilk etapta kullanıyorsun? –

+0

Belki sadece eski düz kapsamı: '{string iç = ...} // iç tanımlanmamış burada' – csharpfolk

cevap

1

yerine ThreadLocal kullanmalısınız

AsyncLocal<string> Data = new AsyncLocal<string>(); 
ThreadLocal<string> Data1 = new ThreadLocal<string>(); 
Data.Value = "One"; 
Data1.Value = "Two"; 

Task.Factory.StartNew(() => 
{ 
    string InnerValue = Data.Value; //InnerValue equals to "One", 
    string InnerValue1 = Data1.Value; //InnerValue1 equals to null, 
}); 

Yardım edin, ben

+1

Girdiğiniz için teşekkürler. Ancak sorun, bir kayıt çerçevesi için bağlamı korumak için AsyncLocal ile çalışmam gerektiğidir. Yani bir şekilde uyumsuzluğu bağlamında "sıfırla" ihtiyacım var, çünkü bir dışarıda ve içeride çalışmak zorundayım. –

İlgili konular