5

der geht zurück Lassen Sie sagen, dass ich diesen Code haben, istIst SynchronizationContext.Current zurückgesetzt, wenn ein Thread zu Thread

ThreadPool.QueueUserWorkItem(unused => 
    { 
     SynchronizationContext.SetSynchronizationContext(
      new MyCustomSynchronizationContext()); 

     // not reset back to null 
    }, null); 

Die aktuelle Synchronisationskontext durchgesickert zurück Pool fädeln. Wenn jemand ThreadPool.QueueUserWorkItem erneut aufruft und derselbe Thread zum Verarbeiten des anderen Arbeitselements verwendet wird, wird der aktuelle Synchronisationskontext dieses Threads wieder auf null zurückgesetzt oder bleibt MyCustomSynchronizationContext?

Gilt dieselbe Antwort für jede andere Möglichkeit zum Ausführen von Aufgaben im Thread-Pool, z. Task.Run, BeginInvoke usw.?

Ich weiß, dass das TLS im Allgemeinen nicht zurückgesetzt wird, aber .NET-Quellcode zeigt, dass der Speicher des aktuellen Synchronisationskontexts nicht sehr klar definiert ist (meistens kommt es aus dem Ausführungskontext, aber es scheint speziell zu sein für WinRT aus irgendeinem Grund).

Antwort

2

Die Antwort ist technisch undefiniert/undokumentiert. Sie sollten SynchronizationContext nicht in einen Threadpool-Thread einfügen, ohne ihn zu bereinigen.

Das heißt, ich vermute stark, dass SynchronizationContext nicht gelöscht ist. Dies gilt für jeden Code, der Tasks im Thread-Pool ausführt.

+0

Ich überprüfte den .NET-Quellcode genauer. Durch Ändern des SynchronizationContext wird der im Ausführungskontext gespeicherte Wert geändert. Ich verstehe, dass der Ausführungskontext nicht für andere Jobs im Thread-Pool vererbt wird, d. H. Der Thread-Pool verwendet den erfassten Ausführungskontext des Aufrufers des anderen Thread-Pool-Jobs, nicht den für den vorherigen Job, der ihn geändert hat. Ist das korrekt? – Palo