2012-01-04 95 views
1

我有一个问题,不知道它在哪里...... 如果我这样做在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线程。

+0

可能是因为您依赖于Windows消息泵,它只是GUI线程,以便运行事件通知。 – Tormod 2012-01-04 16:44:15

+0

在STA线程中调用Application.Run()是必需的。将它附加到DoWork()。其他几种方法无法正常工作,COM服务器必须在同一个线程上创建。 – 2012-01-04 17:21:11

+0

我已经明确地在新线程中将公寓模式设置为STA。这与设置[STATHREAD]属性相同。 – Luka 2012-01-04 18:14:10

回答

0

问题是没有工作的控制驱动程序(COM)DLL。安装新版本,现在它可以工作。

0

你可以在HandleEvent中创建一个线程来完成你所需要的。如果您需要与UI进行交互,则必须将您创建的任何线程与UI线程同步。

+0

所以你的意思是在Handle事件方法中创建另一个线程?我不对UI做任何事情,只是开始听取事件。 – Luka 2012-01-04 18:16:08