我有一个问题,不知道它在哪里...... 如果我这样做在Windows窗体应用程序:与regsrv32注册C#COM事件不触发
private void btnListen_Click(...)
{
var t = new Thread(DoWork);
t.SetAppartmentState(ApartmentState.STA);
t.Start();
}
the DoWork method...
private void DoWork()
{
var controls = GetControls();
foreach (var c in controls)
{
control.OnEvent += HandleEvent;
}
}
private void HandleEvent()
{
DoSomething...
}
的控件封装的COM对象
当在控件上触发事件时,我不会在我的Windows窗体应用程序HandleEvent方法中收回事件。
,但如果我的代码改成这样:
private void btnListen_Click(...)
{
DoWork();
}
的它工作一切ok。 我需要这个在另一个线程中执行。
为什么在使用线程时不工作? 请帮忙。
感谢
编辑: 我也是在一个窗口服务尝试这样做。 像这样:
OnStart()
{
Task t = new Task(()=>DoWork);
t.Start();
}
其他每一件事情是相同的,仍然无法正常工作。而且这里没有UI线程。
可能是因为您依赖于Windows消息泵,它只是GUI线程,以便运行事件通知。 – Tormod 2012-01-04 16:44:15
在STA线程中调用Application.Run()是必需的。将它附加到DoWork()。其他几种方法无法正常工作,COM服务器必须在同一个线程上创建。 – 2012-01-04 17:21:11
我已经明确地在新线程中将公寓模式设置为STA。这与设置[STATHREAD]属性相同。 – Luka 2012-01-04 18:14:10