Erfassen des Hauptthreads "SynchronizationContext" oder "Dispatcher" aus einer Bibliothek

Ich habe eine C # -Bibliothek, die die Möglichkeit haben möchte, Arbeiten an den "Haupt" -UI-Thread zu senden / zu posten (falls vorhanden). Diese Bibliothek kann verwendet werden von:

Eine Winforms-AnwendungEine native Anwendung (mit Benutzeroberfläche)Eine Konsolenanwendung (ohne Benutzeroberfläche)

In der Bibliothek möchte ich während der Initialisierung etwas aufzeichnen (einen SynchronizationContext, einen Dispatcher, einen Task Scheduler oder etwas anderes), mit dem ich (zu einem späteren Zeitpunkt) Arbeiten an den Hauptthread senden / senden kann (sofern der Haupt-Thread hat diese Fähigkeit - dh es hat eine Nachrichtenpumpe). Beispielsweise möchte die Bibliothek einige Winforms-Benutzeroberflächen im Hauptthread einrichten, wenn die Hauptanwendung die Möglichkeit hat, zum Hauptthread zu gelangen.

Dinge, die ich versucht habe:

A SynchronizationContext: Das Aufzeichnen funktioniert problemlos für eine Winforms-Anwendung (aWindowsFormsSynchronizationContext wird installiert alsAktuell SynchronizationContext. Dies funktioniert auch in der Konsolenanwendung einwandfrei, da ich feststellen kann, dass der aktuelle Synchronisierungskontext null ist (und daher weiß, dass ich keine Möglichkeit habe, Arbeit an den Hauptthread zu senden / zu posten). Das Problem hierbei ist die native Benutzeroberflächenanwendung: Sie verfügt über die Fähigkeit (d. H. Sie verfügt über eine Nachrichtenpumpe), der Kontext für die aktuelle Synchronisierung ist jedoch null und kann daher nicht vom Anwendungsfall der Konsole unterschieden werden. Wenn ich unterscheiden könnte, könnte ich einfach einen WindowsFormsSynchronizationContext auf dem Hauptthread installieren, und es kann losgehen.A Dispatcher: Erfassen Sie dies mitAktuell Erstellt einen neuen SynchronizationContext. So bekomme ich in allen Situationen einen Dispatcher zurück. Verwenden Sie jedoch für eine Konsolen-AppDispatcher.Invoke Von einem Hintergrund-Thread hängt (wie erwartet). ich könnte benutzenDispatcher.FromThread (wodurch kein Dispatcher für den Thread erstellt wird, falls keiner vorhanden ist). Die native UI-Anwendung gibt jedoch mit dieser Methode einen Null-Dispatcher zurück, sodass ich wiederum nicht in der Lage bin, die UI-Anwendung von der Konsolenanwendung zu unterscheiden.A TaskScheduler: Ich könnte benutzenFromCurrentSynchronizationContext. Dies hat die gleichen Probleme wie der SynchronizationContext. Das heißt Vor dem Aufrufen von FromCurrentSyncronizationContext muss überprüft werden, ob Current SynchronizationContext den Wert null hat (dies gilt für die Konsolenanwendung und die native Benutzeroberflächenanwendung). Daher kann ich die native UI-Anwendung nicht von der Konsolenanwendung unterscheiden.

Natürlich kann der Benutzer meiner Bibliothek angeben, ob es sich um eine UI-Anwendung handelt, wenn er my aufruftInitialize Methode, aber ich hatte gehofft, diese Komplikation für den Benutzer der Bibliothek zu vermeiden, wenn möglich.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage