首页 文章

多线程工作完美,直到我点击com对象

提问于
浏览
0

我正在使用com互操作来与一些物理硬件进行通信 .

当我需要来自硬件的当前读数时,我有一个精心设计的线程代码,使其远离我的UI线程,以便在查询硬件时我不会锁定UI,因为有时它可能需要1- 2分钟(虽然通常更像是1-5秒) .

因此,一旦我进入com对象,它就会反弹回主UI线程,并且在阅读期间UI会变得很忙 .

主应用程序是一个.net WPF应用程序,默认情况下它是STA . COM对象是在主线程上创建的,但是它创建了我的单件工厂,因此所有这些对象都是由相同的几行UI创建的 .

我喜欢展示一些代码,但这并不是因为这些东西仅仅是几行代码 .

这种行为会有什么样的工作?我也希望能够同时从多个com对象中读取 .

如果要创建后台线程来在我的对象facotry中旋转这些com对象 . 如何让它们保持活力来处理被编组回来的工作?

3 回答

  • 0

    假设对象是单元线程 - 请确保在创建它的同一线程上调用它 . 否则,调用将通过Windows消息路由到对象的主线程,从而阻止UI .

    如果其他一切都失败了 - 产生一个工作进程 .

    编辑:和另一点 - 工作线程需要是一个STA,并需要一个消息循环 . 否则,对象将存在于主线程中,并具有路由和UI阻止功能 .

  • 1

    我有它的工作 .

    以前我的构造函数的工作方式如下:

    internal class Device
    {
        private ComDeviceLibrary.UberDevice myDevice;
    
        internal Device(DeviceInitObject myInitOptions)
        {
            myDevice = new ComDeviceLibrary.UberDevice();
        }
    }
    

    现在,如果我这样做:

    internal class Device
    {
        private ComDeviceLibrary.UberDevice myDevice;
    
        internal Device(DeviceInitObject myInitOptions)
        {
    
            AutoResetEvent createHandle = new AutoResetEvent(false);
            Thread creationThread = new Thread(CreateDevice);
            creationThread.IsBackground = false;
            creationThread.SetApartmentState(ApartmentState.MTA);
            creationThread.Start(createHandle);
            createHandle.WaitOne();
        }
    
        private void CreateDevice(object objWaitHandle)
        {
    
            myDevice = new ComDeviceLibrary.UberDevice();
            ((AutoResetEvent)objWaitHandle).Set();
        }
    }
    

    有用!

  • 1

    “我有一个精心设计的线程代码” - 这里有一个“着名的最后一句话” .

    “COM对象是在主线程上创建的,但它创建了我的单件工厂,因此所有这些对象都是由相同的几行UI创建的 . ”

    如果您的COM对象是在GUI线程中创建的,那么当它阻止GUI线程时为什么会感到惊讶?为什么不在直接与硬件对话的线程中创建COM对象?

相关问题