我正在使用com互操作来与一些物理硬件进行通信 .
当我需要来自硬件的当前读数时,我有一个精心设计的线程代码,使其远离我的UI线程,以便在查询硬件时我不会锁定UI,因为有时它可能需要1- 2分钟(虽然通常更像是1-5秒) .
因此,一旦我进入com对象,它就会反弹回主UI线程,并且在阅读期间UI会变得很忙 .
主应用程序是一个.net WPF应用程序,默认情况下它是STA . COM对象是在主线程上创建的,但是它创建了我的单件工厂,因此所有这些对象都是由相同的几行UI创建的 .
我喜欢展示一些代码,但这并不是因为这些东西仅仅是几行代码 .
这种行为会有什么样的工作?我也希望能够同时从多个com对象中读取 .
如果要创建后台线程来在我的对象facotry中旋转这些com对象 . 如何让它们保持活力来处理被编组回来的工作?
3 回答
假设对象是单元线程 - 请确保在创建它的同一线程上调用它 . 否则,调用将通过Windows消息路由到对象的主线程,从而阻止UI .
如果其他一切都失败了 - 产生一个工作进程 .
编辑:和另一点 - 工作线程需要是一个STA,并需要一个消息循环 . 否则,对象将存在于主线程中,并具有路由和UI阻止功能 .
我有它的工作 .
以前我的构造函数的工作方式如下:
现在,如果我这样做:
有用!
“我有一个精心设计的线程代码” - 这里有一个“着名的最后一句话” .
“COM对象是在主线程上创建的,但它创建了我的单件工厂,因此所有这些对象都是由相同的几行UI创建的 . ”
如果您的COM对象是在GUI线程中创建的,那么当它阻止GUI线程时为什么会感到惊讶?为什么不在直接与硬件对话的线程中创建COM对象?