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

标签 c# .net com

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

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/

相关文章:

c# - 阻止鼠标光标水平移动,但仍想捕获 MouseMove 事件

c# - 向 COM 公开 .NET 事件?

c# - C# 中控制结构 'for' 和 'foreach' 的性能差异

c# - 在 PictureBox 中仅使用部分图像

c# - 使用 Caliburn.Micro 的分层导航模型

.net - Mono 是 .NET 的子集吗?

c# - 在 C# 中使用 ComInterop 进行 COM 对象后期绑定(bind)

c++ - 如何在 COM 接口(interface)定义中指定用户定义的类型参数?

c# - LINQ & IEnumerable<String> 重新求值

c# - 如何在不使用反射的情况下避免重复访问属性的代码