我如何才能找到方法是否执行对UI线程或不处于分离的方式?
题
下面是我的问题:我需要确保一个对象在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;
}
不隶属于 StackOverflow