Comment puis-je savoir si la méthode exécute le thread d'interface utilisateur ou non d'une manière découplée?

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

  •  05-09-2019
  •  | 
  •  

Question

Voici le problème que j'ai: je dois vous assurer un objet est instancié sur le thread d'interface utilisateur. Dans le cas contraire, il devrait lancer une exception. Mais comment puis-je vérifier l'intérieur d'une méthode si elle est en cours d'exécution sur le thread d'interface utilisateur? Note:. Je ne veux pas passer des informations dans le constructeur de l'objet

Le candidat idéal serait la DispatcherSynchronizationContext (mise en œuvre WPF de SynchronizationContext) qui détient en interne une référence à Dispatcher qui fait référence le fil auquel il est associé, mais malheureusement, ce champ est privé donc il n'y a aucun moyen pour moi d'y accéder.

Était-ce utile?

La solution

Petite précision, bien qu'il y ait généralement seulement 1 thread d'interface utilisateur, il peut y avoir plusieurs threads d'interface utilisateur. Cela est vrai pour les deux WPF et WinForms.

La meilleure façon que je l'ai trouvé pour y parvenir est bien avec un SynchronizationContext. WPF et WinForms établiront un SynchronizationContext sur un fil, ils sont en cours d'exécution sur l'interface utilisateur. Ceci est la fonction que j'utilise si je ne suis pas attaché à un modèle d'interface utilisateur particulier.

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

Note, il est en aucune façon à toute épreuve. Il est possible pour les composants non-UI pour établir un SynchronizationContext et cela retourneraient vrai pour un simple fil des travailleurs. D'où le nom ne faisant pas autorité.

légèrement plus fiable pour ce faire est la suivante. Mais il vous oblige à faire référence au moins une partie de WPF à mettre en œuvre.

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

Autres conseils

Dispatcher.CheckAccess () renvoie true si votre code fonctionne sur le même fil que le répartiteur. Il devrait fonctionner s'il n'y a qu'un seul Dispatcher / UIThread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top