我有一个生成新线程的方法,如下所示:
Thread thread = new Thread(() => ClassObject.SetXY(var1, var2));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
我目前拒绝访问 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))
我正在尝试的 COM 互操作异常。
当我在同一个父线程中运行函数时,我没有得到那个异常。但是,我需要它在单独的线程中运行以将公寓状态设置为 STA。我目前正在将我的代码作为 Windows 服务运行,即使我在 main 方法上使用 [STAThread] 也无法正常工作。
简单说一下我需要什么:
1- 要么像上面那样启动一个具有相同安全性的线程 (STA) 上下文作为父线程。
2- 不要启动新线程(这将解决访问被拒绝的问题,但 将由于线程的单元状态不抛出异常 是 STA) 但让 windows 服务的线程在 STA 中运行 公寓状态。
谢谢
最佳答案
您可以复制父线程的执行上下文,然后在衍生线程的该上下文中运行您的代码:
var executionContext = ExecutionContext.Capture();
Thread thread = new Thread(state => {
ExecutionContext parentContext = (ExecutionContext)state;
ExecutionContext.Run(parentContext, _ => {
ClassObject.SetXY(var1, var2);
}, null);
});
thread.Start(executionContext);
关于c# - 在 C#.net 中启动一个与父安全上下文相同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962208/