我正在使用第三方库中的COM对象,该对象会生成周期性事件。当我从Winforms应用程序中使用该库时,将对象作为类成员并在主窗体线程中创建它,一切正常。但是,如果我从另一个线程创建对象,则不会收到任何事件。
我还尝试了以下方法:
我的猜想是,在用于创建对象的同一线程中需要有某种事件循环。
我需要从控制台应用程序中使用此对象。我猜可以使用Application.DoEvents,但我宁愿不在控制台应用程序中包含Winforms命名空间。
我该如何解决这个问题?
更新3(2011-06-15):供应商终于回答了。简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在差异,但他们不知道差异在哪里。
我同意他们的看法;任何关于此事的启示都将非常感激。
更新:
根据Richard对mdm答案的评论:
如果其他组件是单线程的,并且从MTA实例化,则Windows将创建工作线程+窗口+消息泵并执行必要的封送。
试图遵循他的建议,我正在执行以下操作:
更新2:
我按照João Angelo的答案更改了代码。
using System;
namespace ConsoleApplication2
{
class Program
{
[STAThread]
static void Main(string[] args)
{
MyComObjectWrapper wrapper = new MyComObjectWrapper();
}
}
class MyComObjectWrapper
{
MyComObject m_Object;
AutoResetEvent m_Event;
public MyComObjectWrapper()
{
m_Event = new System.Threading.AutoResetEvent(false);
System.Threading.Thread t = new System.Threading.Thread(() => CreateObject());
t.SetApartmentState (System.Threading.ApartmentState.STA);
t.Start();
Wait();
}
void ObjectEvt(/*...*/)
{
// ...
}
void Wait()
{
m_Event.WaitOne();
}
void CreateObject()
{
m_Object = new MyComObject();
m_Object.OnEvent += ObjectEvt;
System.Threading.Thread.CurrentThread.Join();
}
}
}
我还尝试了以下方法:
public MyComObjectWrapper()
{
CreateObject();
}