在STA线程中使用后如何使用对象?

时间:2012-06-26 18:28:37

标签: c# multithreading visual-studio-2010 vsto sta

我正在做一个Microsft PowerPoint加载项解决方案,它可以从硬件中读取信息,硬件开发人员给了我们SDK来控制这个硬件,但是我在尝试控制它时遇到了问题。

我有这个库 ARS

有一堂课 ARS.BaseConnection

我有这个变量 ARS.BaseConnection BaseConn;

问题是当我创建一个类型为BaseConnection

的新对象时
BaseConn = new ARS.BaseConnection();

调试器没有显示任何异常,POWERPNT.exe只是崩溃并停止。

我尝试调试POWERPNT,它说访问冲突写入位置0x00d20f78。但我不编写PowerPoint。

我认为SDK中的演示程序(实际上有效)在main之前有一个[STAThread],所以我认为它必须作为STA运行,所以我创建了一个新的线程:

    ARS.BaseConnection BaseConn;`

    public form1()
    {
        InitializeComponent();

        System.Threading.Thread thread = new System.Threading.Thread(createBase);
        thread.SetApartmentState(System.Threading.ApartmentState.STA);
        thread.Start();
        thread.Join();

        BaseConn.Open(); // There is the problem, when I'm trying to use open() BaseConn debuger says: COM object that has been separated from its underlying RCW cannot be used.
    }

    private void createBase()
    {
        BaseConn = new ARS.BaseConnection(); //If it runs in a STA tread doesn't crash.
    }

我得到与其基础RCW分离的COM对象无法使用。

我该如何使其有效?

1 个答案:

答案 0 :(得分:0)

该对象只能从其创建线程中访问。

如果您需要从另一个线程访问该对象,可以使用dispatcher切换到其线程。

考虑在主线程上创建它(首先将主线程设置为STA)。