【问题标题】:Start a Thread with same as parent security context in C#.net在 C#.net 中启动与父安全上下文相同的线程
【发布时间】: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 模式。查看如何在线程池代码中设置上下文/复制它听起来像是一种选择。

标签: c# .net com


【解决方案1】:

您可以复制父线程的执行上下文,然后在衍生线程上的该上下文中运行您的代码:

var executionContext = ExecutionContext.Capture();
Thread thread = new Thread(state => {
    ExecutionContext parentContext = (ExecutionContext)state;
    ExecutionContext.Run(parentContext, _ => {
        ClassObject.SetXY(var1, var2);
    }, null);
});

thread.Start(executionContext);

【讨论】:

  • 我仍然使用此解决方案 E_ACCESSDENIED
猜你喜欢
  • 2011-02-06
  • 2012-12-29
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2016-10-19
  • 2012-07-18
相关资源
最近更新 更多