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

在C#.net中启动与父安全上下文相同的线程,c#,.net,com,C#,.net,Com,我有一个生成新线程的方法,如下所示: Thread thread = new Thread(() => ClassObject.SetXY(var1, var2)); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); 我当前从我正在尝试的COM互操作中获得访问被拒绝(来自HRESULT:0x80070005(E_ACCESSDENIED)的异常)异常。

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

Thread thread = new Thread(() => ClassObject.SetXY(var1, var2));
thread.SetApartmentState(ApartmentState.STA);               
thread.Start();
thread.Join(); 
我当前从我正在尝试的COM互操作中获得访问被拒绝
(来自HRESULT:0x80070005(E_ACCESSDENIED)的异常)
异常。 当我在同一个父线程中运行函数时,不会出现异常。但是,我需要它在单独的线程中运行,以将单元状态设置为STA。我目前正在以windows服务的形式运行我的代码,即使我在main方法上使用[StatThread],我也无法让它正常工作

简要介绍我需要的:

  • 1-启动一个具有相同安全性的线程(STA) 上下文作为父线程

  • 2-不要启动新线程(这将解决拒绝访问问题,但 由于线程not的单元状态,将引发异常 是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);

尝试使用ThreadPool它确实复制了调用方安全上下文。@user629926:以前没有使用过,您能给我演示一下如何使用ThreadPool执行上述操作的代码吗?我发现它在内部使用了一个ExecutionxContext,请试着研究一下。我的意思是只调用ThreadPoll.QueieUserWorkItem,而不是创建新线程。@user629926-ThreadPool在这里没有帮助,因为据我所知,线程池中的线程无法控制STA/MTA模式。查看如何在线程池代码中设置上下文/复制它听起来像是一个选项。我仍然使用此解决方案
E_ACCESSDENIED