【问题标题】:C# Com events not firingC# Com 事件未触发
【发布时间】: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


【解决方案1】:

您可以在 HandleEvent 中创建一个线程来执行您需要它执行的操作。如果您需要它与 UI 交互,则必须将您创建的任何线程与 UI 线程同步。

【讨论】:

  • 所以你的意思是在 Handle 事件方法中创建另一个线程?我没有对 ui 做任何事情,只是开始监听事件。
【解决方案2】:

问题是控制驱动程序 (COM) dll 不起作用。安装了新版本,现在可以使用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多