Vergleichen von SynchronizationContext

9

Wie vergleiche ich SynchronizationContext? Es scheint, dass derselbe Dispatcher bei der Verwendung von BeginInvoke einen anderen SynchronizationContext erstellen kann. Wenn ich in die zwei (ungleichen) Kontexte drillt, sehe ich, dass die Dispatcher-Thread-ID die gleiche ist, aber sie sind nicht gleich.

%Vor%

Vielleicht können die zwei nicht zusammen verwendet werden. Ich habe bemerkt, dass das tatsächlich funktioniert:

%Vor%

Update Aber seltsamerweise funktioniert es nicht immer.

%Vor%

bekommt niemals einen übereinstimmenden _context und geht zum Beispiel für immer weiter. Obwohl es nicht sollte. In diesem letzten Beispiel sind die Threads tatsächlich gleich und es gibt einen Kontext, aber es ist anders.

Update2 Ok, ich habe es zur Arbeit gebracht, aber ich fühle mich wirklich unwohl dabei. Wenn Sie Post oder Send senden, wird Ihre Aufgabe anscheinend von dem rechten Thread ausgeführt, aber wenn Sie nicht von der Benutzeroberfläche kommen, scheint es, dass ein neuer SynchronizationContext generiert wird.

%Vor%

Und sieh dir das an:

"Erfordert vollständige Vertrauenswürdigkeit für den unmittelbaren Aufrufer. Dieser Member kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden." : (

    
tofutim 21.11.2012, 18:46
quelle

1 Antwort

2

Ich denke, Sie sind interessiert BaseCompatibilityPreferences.ReuseDispatcherSynchronizationContextInstance .

Diese Einstellung legt fest, ob eine einzelne SynchronizationContext-Instanz für ein bestimmtes Dispatcher-Objekt verwendet wird oder nicht. Dies gilt standardmäßig bis .net 4 und falsch in .net 4.5 (dies ist die Verhaltensänderung, die LukeN beobachtet).

Wenn Sie jetzt nur einen direkten Anruf tätigen möchten und nicht .Send () anrufen, würde ich sagen:

  1. Beim Aufruf von .Send () ruft der DispatcherSynchronizationContext eigentlich nur dann direkt auf, wenn Sie im richtigen Thread sind (nicht die Dispatcher Queue), so dass Sie sowieso nicht viel gewinnen (ein paar Checks und Anrufe von den zusätzlichen Ebenen der Indirektion).

  2. Wenn Sie nur mit WPF codieren, können Sie mit Dispatcher.CheckAccess () und Dispatcher.Invoke () tun, was Sie wollen.

Im allgemeinen Fall gibt es keine Möglichkeit, zwei SynchronizationContexte zu vergleichen, also sollten Sie einfach .Send () aufrufen. Es ist wahrscheinlich kein Leistungsproblem, denken Sie daran, dass eine vorzeitige Optimierung die Wurzel allen Übels ist - & gt; Messen Sie zuerst.

    
jods 29.05.2013 23:51
quelle

Tags und Links