c# – 如何以分离的方式找出方法是否在UI线程上执行?
发布时间:2020-12-15 08:30:57 所属栏目:百科 来源:网络整理
导读:这是我遇到的问题:我需要确保在UI线程上实例化一个对象.如果不是,它应该抛出异常.但是如何检查方法内部是否在UI线程上运行?注意:我不想将任何信息传递给对象的构造函数. 完美的候选者将是DispatcherSynchronizationContext(SynchronizationContext的WPF实
这是我遇到的问题:我需要确保在UI线程上实例化一个对象.如果不是,它应该抛出异常.但是如何检查方法内部是否在UI线程上运行?注意:我不想将任何信息传递给对象的构造函数.
完美的候选者将是DispatcherSynchronizationContext(SynchronizationContext的WPF实现),它在内部持有对Dispatcher的引用,Dispatcher引用与之关联的线程,但遗憾的是该字段是私有的,因此我无法访问它. 解决方法
虽然通常只有1个UI线程,但可以有很多UI线程.对于WPF和WinForms都是如此.
我发现实现这一目标的最好方法是使用SynchronizationContext. WPF和WinForms都将在他们运行UI的任何线程上建立SynchronizationContext.如果我没有绑定任何特定的UI模型,这是我使用的功能. public bool IsPossiblyUIThread() { return SynchronizationContext.Current != null; } 请注意,它绝不是万无一失的.非UI组件可以建立SynchronizationContext,对于简单的工作线程,这将返回true.因此,非权威的名称. 稍微更可靠的方法如下.但它要求您至少引用WPF的一部分来实现. public bool IsLikelyWpfUIThread() { var context = SynchronizationContext.Current; return context != null && context is DispatcherSynchronizationContext; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Cocos2d:使用 CCCamera 做滚动效果 (Four Ways of Scrolli
- 错误“应用程序窗口应具有根视图控制器”(iOS)
- objective-c – 您的应用程序代理设置在哪里,并初始化其窗口
- ruby-on-rails – 在Rails表单中使用textarea帮助器
- 来自libc的istringstream的析构函数中对operator delete的未
- 如何在不使用C中的typedef的情况下声明一个返回指向函数的函
- Xml让人郁闷的SelectNodes方法
- Ajax在元素列表中使用不显眼的javascript请求
- 再谈基于Quick-Cocos2d-x的资源更新方案
- 3.2 依赖注入的3种实现方式