我有一个生成新线程的方法如下:
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中运行 公寓州。
由于
答案 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);