【发布时间】:2012-01-05 21:12:55
【问题描述】:
我有一个问题,不知道它在哪里...... 如果我在 Windows 窗体应用程序中执行此操作:
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...
}
控件是用 regsrv32 注册的 Wrapped Com 对象
在控件上触发事件时,我不会在我的 Windows 窗体应用程序 HandleEvent 方法中接收事件。
但是如果我把代码改成这样:
private void btnListen_Click(...)
{
DoWork();
}
一切正常。 我需要在另一个线程中执行它。
为什么在使用线程时这不起作用? 请帮忙。
谢谢
编辑: 我也在 Windows 服务中尝试过这个。 像这样:
OnStart()
{
Task t = new Task(()=>DoWork);
t.Start();
}
其他一切都是一样的,但仍然不起作用。而且这里没有 UI 线程。
【问题讨论】:
-
可能是您依赖 Windows 消息泵,它只是 GUI 线程,以便运行事件通知。
-
在 STA 线程中需要调用 Application.Run()。将其附加到 DoWork()。其他几种无法正常工作的方法,COM 服务器必须在同一个线程上创建。
-
我已在新线程中明确将公寓模式设置为 STA。这与设置 [STATHREAD] 属性相同。
标签: c# multithreading events com