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