首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不是表单时使用InvokeRequired

在不是表单时使用InvokeRequired
EN

Stack Overflow用户
提问于 2010-11-16 06:32:55
回答 3查看 2.2K关注 0票数 1

我有一个事件处理程序,我希望在创建对象的原始线程中处理它,这样它就不会阻塞。对于表单,可以很容易地使用InvokeRequired将其强制到原始线程。但是如果你的类不是一个表单,你该怎么做呢?

谢谢,

下午

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-16 10:26:18

这不是一件容易的事。首先,您必须在相关线程上创建某种类型的消息接收循环。然后,您需要以这样一种方式实现ISynchronizeInvoke:它发布一条包含要执行的委托的消息到一个队列中,目标线程可以拾取并提取该委托并执行它。生产者-消费者模式通常对设置这一点很有用。重要的是,你不能将任何委托编组到任何线程上。目标线程必须经过特殊设计才能正常工作。它在UI线程中工作,因为Application.Run获得了Control.Invoke方法使用的消息循环。

票数 2
EN

Stack Overflow用户

发布于 2010-11-16 06:46:15

使用窗体/控件,被调用的委托被放置在UI消息泵中。在创建对象的线程上调用将需要在该线程上使用某种消息泵机制。

如果它是在UI线程上创建的,最好的方法是获取对UI控件的引用并在UI控件上调用。如果它是在别处创建的线程,你将不得不实现你自己的机制。

票数 2
EN

Stack Overflow用户

发布于 2010-11-16 06:41:16

创建具有特殊名称的后台线程,并检查Thread.CurrentThread.Name以查看它是背景还是UI。

如果你在后台创建线程,你也可以使用Thread.CurrentThread.IsBackground,所以它对于UI线程是假的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4189520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档