Ich habe gelesen this question von Noseratio, die ein Verhalten zeigt, wo TaskScheduler.Current
ist nicht die gleiche nach einem erwarteten hat seinen Betrieb beendet.Warten auf den Kontext nach dem asynchronen Vorgang nicht fortgesetzt?
Die Antwort lautet:
Wenn es keine eigentliche Aufgabe ist ausgeführt wird, dann
TaskScheduler.Current
ist die gleiche wieTaskScheduler.Default
was wahr ist. Ich sah es schon here:
TaskScheduler.Default
- Gibt eine Instanz des
ThreadPoolTaskScheduler
TaskScheduler.Current
- Wenn innerhalb einer Ausführung Task aufgerufen wird wieder die
TaskScheduler
von die derzeit Aufgabe kehrt die Ausführung- Wenn von einem anderen Ort namens
TaskScheduler.Default
Aber dann dachte ich, Wenn ja, lassen Sie uns tun erstellen eine tatsächliche Task
(und nicht nur Task.Yield()
) und testen Sie es:
Erste Messagebox ist "True", se cond ist "False"
Frage:
Wie Sie sehen können, habe ich eine tatsächliche Aufgabe erstellt.
Ich kann verstehen, warum die erste MessageBox True
Ausbeute. Das ist becuase der:
Wenn innerhalb einer Ausführung Task aufgerufen wird die Taskscheduler der gerade ausgeführten Aufgabe
Und diese Aufgabe zurückkehren ts
hat, die die TaskScheduler.FromCurrentSynchronizationContext()
gesendet wird, aber warum der zusammenhang ist nicht bei der zweiten MessageBox erhalten? Für mich war es aus Stephan's Antwort nicht klar.
Zusätzliche Informationen:
Wenn ich stattdessen schreiben (der zweiten messagebox):
MessageBox.Show((TaskScheduler.Current == TaskScheduler.Default).ToString());
Es true
nicht ergeben. Aber warum ?
Ausgezeichnete Frage, aber was, wenn 'Task-Scheduler! = Synchronisationskontext '? – AgentFire
Ein guter Fall für die harte Regel: nimm niemals 'TaskScheduler.Current' ist, was du denkst :) Es ist nur garantiert, was du an 'Factory.StartNew' für den Umfang der Aufgabenaktion lambda weitergegeben hast (was in deinem Fall' Func 'ist und zurückkommt, wenn es den ersten' trifft warte '). Jedes andere Verhalten sollte als Implementierungsdetails behandelt werden. –
Noseratio