Ich versuche, über SynchronizationContext
und Freunde zu lernen. Wenn ich einen benutzerdefinierten Synchronisationskontext am Anfang von z. eine Konsolen-App Unter welchen Bedingungen fließt der aktuelle Synchronisationskontext mit meinen asynchronen Operationen? Gibt es Unterschiede zwischen Task
und anderen, z.B. Delegate.BeginInvoke
?SynchronizationContext, wann fließt es und wann nicht?
void Main()
{
SynchronizationContext.SetSynchronizationContext(new FooContext());
Action a =() =>
{
var current = SynchronizationContext.Current;
//current is null here
};
a.BeginInvoke(null,null);
...sleep
Wenn ich Sachen auf dem Thread-Pool auszuführen, bin ich ein Synchronisationskontext zu diesem bestimmten Thread zuzuordnen gezwungen, die zur Zeit meiner Arbeit ausgeführt wird?
Werfen Sie einen Blick auf diesen Artikel http://msdn.microsoft.com/en-us/magazine/gg598924.aspx. Aber ein Problem ist, dass anderer Code wählen kann, den SynchronizationContext zu stoppen, indem er ".ConfigureAwait (false)" aufruft. In der Tat ist es die beste Vorgehensweise für Nicht-UI-Bibliotheken, dies zu tun, da sie sich nicht darum kümmern, dass, wenn "Auf Wiedersehen" in demselben Thread erwartet wird, sie gestartet wurde. –
Es ist eine unglaublich breite Frage. Die einzige Methode, mit der Sie dabei herauskommen, ist das Verlernen, dass die BeginInvoke() - Methode eines Delegates * alles * mit SynchronizationContext zu tun hat."BeginInvoke" ist nur ein generischer Name für "Code asynchron ausführen". SynchronizationContext hat nur etwas damit zu tun, die Art von Problemen zu lösen, auf die Sie stoßen, wenn Sie das tun. –
Vielleicht beantworten Sie eine Erklärung, warum es zu breit ist? Viele Dokumente da draußen glauben, dass der Synchronisationskontext mit dem Ausführungskontext zwischen asynchronen Operationen fließt. Wie im obigen Beispiel fließt der logische Aufrufkontext, aber nicht der Synchronisationskontext. Hinweise darauf, warum dies der Fall ist, wären interessant. –