3

我有一个方法可以生成一个新线程,如下所示:

Thread thread = new Thread(() => ClassObject.SetXY(var1, var2));
thread.SetApartmentState(ApartmentState.STA);               
thread.Start();
thread.Join(); 

(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))我目前从我正在尝试的 COM 互操作中获得拒绝访问异常。当我在同一个父线程中运行该函数时,我没有得到那个异常。但是,我需要它在单独的线程中运行以将公寓状态设置为 STA。我目前正在将我的代码作为 Windows 服务运行,即使我在 main 方法上使用 [STAThread],我也无法让它工作。

简要地说我需要什么:

  • 1-启动一个像上面一样的线程(STA),它与父线程具有相同的安全上下文。

  • 2-不要启动一个新线程(这将解决访问被拒绝的问题,但由于线程的单元状态不是STA而引发异常),而是使Windows服务的线程在STA单元状态下运行。

谢谢

4

1 回答 1

0

您可以复制父线程的执行上下文,然后在生成的线程上在该上下文中运行您的代码:

var executionContext = ExecutionContext.Capture();
Thread thread = new Thread(state => {
    ExecutionContext parentContext = (ExecutionContext)state;
    ExecutionContext.Run(parentContext, _ => {
        ClassObject.SetXY(var1, var2);
    }, null);
});

thread.Start(executionContext);
于 2012-08-15T17:40:10.040 回答