【发布时间】:2012-08-11 07:54:29
【问题描述】:
我有一个生成新线程的方法,如下所示:
Thread thread = new Thread(() => ClassObject.SetXY(var1, var2));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
我目前从我正在尝试的 COM 互操作中获得访问被拒绝 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 异常。
当我在同一个父线程中运行该函数时,我没有得到那个异常。但是,我需要它在单独的线程中运行以将公寓状态设置为 STA。我目前正在将我的代码作为 Windows 服务运行,即使我在 main 方法上使用 [STAThread],我也无法让它工作。
简要说明我需要什么:
1- 要么像上面那样启动一个具有相同安全性的线程 (STA) 上下文作为父线程。
2- 不要启动新线程(这将解决访问被拒绝的问题,但 由于线程的单元状态不是,将引发异常 是STA),但使Windows服务的线程在STA中运行 公寓状态。
谢谢
【问题讨论】:
-
尝试使用 ThreadPool 它确实会复制调用者安全上下文。
-
@user629926: 以前没用过,你能用线程池显示一些代码吗?
-
我发现它在内部使用 ExecutionxContext 尝试调查。我的意思是只调用 ThreadPoll.QueieUserWorkItem 而不是创建新线程。
-
@user629926 - ThreadPool 在这里无济于事,因为据我所知,无法控制线程池中线程的 STA/MTA 模式。查看如何在线程池代码中设置上下文/复制它听起来像是一种选择。