2016-03-06 6 views
9

AsyncLocal pozwala zachować dane kontekstowe na asynchronicznym przepływie sterowania. Jest to całkiem zgrabne, ponieważ wszystkie kolejne wznowienia (nawet w innym wątku) mogą pobierać i modyfikować dane otoczenia (AsyncLocal on MSDN).C# Async/Oczekiwanie: Pozostaw kontekst AsyncLocal <T> podczas tworzenia zadania

Czy istnieje sposób, aby "opuścić" bieżący asynchroniczny kontekst lokalny dla pod-zadania i w ten sposób utworzyć nowy?

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. 
}); 

W powyższym przykładzie wewnętrzne zadanie współużytkuje kontekst AsyncLocal z zewnętrznym strumieniem sterowania. Czy istnieje sposób na wymuszenie nowego kontekstu?

Aktualizacja: aby rozwiązać mój problem tutaj dodaje pracował jak czar (pomimo faktu, że nie całkowicie zresetować kontekstu):

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

Nie rozumiem twojego pytania. Cały cel "AsyncLocal" polega na przepływie wartości między połączeniami asynchronicznymi i chcesz, aby dane nie płynęły? Dlaczego więc używasz go w pierwszej kolejności? –

+0

Może po prostu stary zwykły zakres: '{string inner = ...} // wewnętrzny nie zdefiniowany tutaj' – csharpfolk

Odpowiedz

1

należy użyć zamiast ThreadLocal

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, 
}); 

Mam nadzieję, że pomoże

+1

Dzięki za twój wkład. Problem polega jednak na tym, że muszę pracować z AsyncLocal, aby zachować kontekst dla struktury logowania. Muszę więc jakoś "zresetować" kontekst asynchroniczny, ponieważ muszę pracować z jednym zewnętrznym i jednym wewnątrz. –