Wie kann ich herausfinden, ob Methode führt auf UI-Thread oder nicht in einer entkoppelten Weise?

StackOverflow https://stackoverflow.com/questions/907166

  •  05-09-2019
  •  | 
  •  

Frage

Hier ist das Problem, das ich habe: Ich sicherstellen müssen, dass ein Objekt auf dem UI-Thread instanziiert wird. Wenn dies nicht der Fall, sollte es eine Ausnahme werfen. Aber wie kann ich innerhalb einer Methode überprüfen, ob es auf dem UI-Thread ausgeführt wird? Hinweis:. Ich möchte keine Informationen in die Objekt Konstruktor übergeben

Der perfekte Kandidat die DispatcherSynchronizationContext (WPF Implementierung von SynchronizationContext) wäre, die intern einen Verweis auf Dispatcher hält, die den Faden verweist er zugeordnet ist, aber leider das Feld ist privat, so gibt es keine Möglichkeit für mich zugreifen zu können.

War es hilfreich?

Lösung

Kleine Klarstellung, obwohl es in der Regel nur 1 UI ist Thread kann es viele UI-Threads sein. Dies gilt sowohl für WPF und WinForms.

Der beste Weg, die ich gefunden habe dies aber zu erreichen, ist mit einem SynchronizationContext. Sowohl WPF und WinForms eine SynchronizationContext auf jedem Thread schaffen sie UI laufen auf. Dies ist die Funktion, die ich verwende, wenn ich nicht auf ein bestimmtes UI-Modell gebunden bin.

public bool IsPossiblyUIThread() {
  return SynchronizationContext.Current != null;
}

Beachten Sie, ist es in keiner Weise narrensicher. Es ist möglich, für Nicht-UI-Komponenten eine SynchronizationContext zu etablieren, und dies würde für einen einfachen Arbeiter-Thread true zurück. Daraus ergibt sich die nicht-autoritative Namen.

A leicht zuverlässiger Weg, dies zu tun, ist wie folgt. Aber es erfordert, dass Sie zumindest einen Teil von WPF verweisen zu implementieren.

public bool IsLikelyWpfUIThread() {
  var context = SynchronizationContext.Current;
  return context != null && context is DispatcherSynchronizationContext;
}

Andere Tipps

Dispatcher.CheckAccess () gibt true zurück, wenn der Code auf dem gleichen Thema wie der Dispatcher läuft. Es sollte funktionieren, wenn es nur ein Dispatcher / UIThread ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top