2010-06-18 6 views
12

Kann mir jemand sagen, wann ich eine verwenden soll und wann die SynchronizationContext-Klasse zu verwenden ist?Dispatcher- und SynchronizationContext-Klassen

Seit einer Weile verwende ich die , um Aufgaben aus einem Hintergrund Thread Warteschlange, dann entdeckte ich die SynchronizationContext.

Antwort

16

AFAIK, wenn WPF verwenden, das SynchronizationContext.Current Objekt vom Typ DispatcherSynchronizationContext, die eigentlich nur ein Wrapper um das Dispatcher-Objekt ist und die Post und Send Methoden delegieren nur Dispatcher.BeginInvoke und Dispatcher.Invoke.

Also selbst wenn Sie sich entscheiden, SynchronizationContext zu verwenden, denke ich, dass Sie Dispatcher hinter den Kulissen anrufen.

Außerdem denke ich, es ist ein wenig umständlich, SynchronizationContext zu verwenden, da Sie einen Verweis auf den aktuellen Kontext an alle Threads übergeben müssen, die in Ihre Benutzeroberfläche aufgerufen werden müssen.

+3

Warum der Downvote? –

4
  1. Verwenden Sie den Dispatcher, wenn der Code eng an WPF gekoppelt ist.

  2. Verwenden Sie den AsyncOperationManager, wenn Sie etwas im Thread 'Context' in die Warteschlange stellen müssen. Dies funktioniert auch mit Windows Forms, ASP .NET und WCF-Anwendungen.

  3. Vermeiden Sie die Verwendung des SynchronizationContext selbst. Der AsyncOperationManager verwendet diesen Mechanismus intern.

+0

Ich weiß, du hast diese Antwort schon vor einiger Zeit geschrieben. Nichtsdestotrotz wäre ich sehr daran interessiert, wenn Sie ein konkretes Beispiel dafür geben könnten, wie Sie 'AsyncOperationManager' verwenden können, um einen Delegaten für die Ausführung auf dem" Kontext "(UI) -Thread in die Warteschlange zu stellen. Ich weiß, wie 'SynchronizationContext' funktioniert; aber ich kann nicht herausfinden, wie 'AsyncOperation' funktionieren soll. (Ich habe derzeit den Eindruck, dass es eher wie ein "Token" für die Verfolgung des Status und des Fortschritts einer asynchronen Operation ist, hilft aber nicht dabei, einen Delegaten für die Ausführung zu planen.) – stakx

+1

Verwendung von AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

Was ist, wenn Sie etwas auf dem UIhread synchron ausführen müssen? AsyncOperation verfügt nicht über eine Send() - Methode, aber SynchronizationContext. – Monstieur