下面是我的问题:我需要确保一个对象在UI线程上实例化。如果不是,它应该抛出一个异常。但我怎么检查方法中无论是在UI线程上运行?注:我不想传递任何信息到对象的构造

在完美的候选人将是DispatcherSynchronizationContext(WPF实现的SynchronizationContext的),它的内部保存到调度员参考它引用它的关联的线程,但遗憾的是那场私人所以没有办法,我访问它。

有帮助吗?

解决方案

小澄清,虽然通常仅存在1个UI线程可以有许多UI线程。这对于WPF和WinForms如此。

我发现做到这一点,虽然最好的办法是用的SynchronizationContext。无论WPF和WinForms将建立运行它们的用户界面的任何线程的SynchronizationContext。这是我使用如果我不依赖于任何特定的UI模型的功能。

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

请注意,这是不以任何方式万无一失。这有可能对非UI组件建立的SynchronizationContext,这将一个简单的工作线程返回true。因此,非权威名称。

A 更可靠的方式来做到这一点如下。但是,它需要您引用至少WPF的一部分,以实现。

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