在C#.net中启动与父安全上下文相同的线程

时间:2012-08-14 23:18:33

标签: c# .net com

我有一个生成新线程的方法如下:

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服务,甚至当我在主方法上使用[STAThread]时,我也无法使用它。

简要说明我的需要:

  • 1-或者像上面那样启动具有相同安全性的线程(STA) 上下文作为父线程。

  • 2-不要启动新线程(这将解决访问被拒绝的问题但是 由于线程的公寓状态不会抛出异常 是STA)但是让Windows服务的线程在STA中运行 公寓州。

由于

1 个答案:

答案 0 :(得分: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);