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.
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? –
Może po prostu stary zwykły zakres: '{string inner = ...} // wewnętrzny nie zdefiniowany tutaj' – csharpfolk