我有一个事件处理程序,我希望在创建对象的原始线程中处理它,这样它就不会阻塞。对于表单,可以很容易地使用InvokeRequired将其强制到原始线程。但是如果你的类不是一个表单,你该怎么做呢?
谢谢,
下午
发布于 2010-11-16 10:26:18
这不是一件容易的事。首先,您必须在相关线程上创建某种类型的消息接收循环。然后,您需要以这样一种方式实现ISynchronizeInvoke
:它发布一条包含要执行的委托的消息到一个队列中,目标线程可以拾取并提取该委托并执行它。生产者-消费者模式通常对设置这一点很有用。重要的是,你不能将任何委托编组到任何线程上。目标线程必须经过特殊设计才能正常工作。它在UI线程中工作,因为Application.Run
获得了Control.Invoke
方法使用的消息循环。
发布于 2010-11-16 06:46:15
使用窗体/控件,被调用的委托被放置在UI消息泵中。在创建对象的线程上调用将需要在该线程上使用某种消息泵机制。
如果它是在UI线程上创建的,最好的方法是获取对UI控件的引用并在UI控件上调用。如果它是在别处创建的线程,你将不得不实现你自己的机制。
发布于 2010-11-16 06:41:16
创建具有特殊名称的后台线程,并检查Thread.CurrentThread.Name
以查看它是背景还是UI。
如果你在后台创建线程,你也可以使用Thread.CurrentThread.IsBackground
,所以它对于UI线程是假的。
https://stackoverflow.com/questions/4189520
复制相似问题