C# 使用SetSynchronizationContext的COM互操作TaskScheduler同步 我有一个C 4库,它由C++ MFC客户端实例化,我试图使用TPL提供一个异步任务工具,它释放客户端的线程,并最终在客户端的主线程上引发一个完整的事件。p>

C# 使用SetSynchronizationContext的COM互操作TaskScheduler同步 我有一个C 4库,它由C++ MFC客户端实例化,我试图使用TPL提供一个异步任务工具,它释放客户端的线程,并最终在客户端的主线程上引发一个完整的事件。p>,c#,com,interop,task-parallel-library,com-interop,C#,Com,Interop,Task Parallel Library,Com Interop,因为我没有UI,所以没有同步上下文,所以出现了旧的FromCurrentSynchronizationConText问题。我想如果我能确定客户端是COM STA客户端,我可以安装一个上下文,所以我读了很多关于如何判断您是否在“主线程”上的帖子,但是建议的测试失败了,因为令人惊讶的是,我们似乎在后台线程上。线程ID是1,它是STA,它不是一个线程池线程,它是活动的,但为什么它认为它是一个背景线程 假设我忽略测试的这一部分并继续安装新的WindowsFormsSynchronizationConte

因为我没有UI,所以没有同步上下文,所以出现了旧的FromCurrentSynchronizationConText问题。我想如果我能确定客户端是COM STA客户端,我可以安装一个上下文,所以我读了很多关于如何判断您是否在“主线程”上的帖子,但是建议的测试失败了,因为令人惊讶的是,我们似乎在后台线程上。线程ID是1,它是STA,它不是一个线程池线程,它是活动的,但为什么它认为它是一个背景线程

假设我忽略测试的这一部分并继续安装新的WindowsFormsSynchronizationContext,这安全吗?本质上我是说‘好的,这是我们的C++应用程序的线程,所以如果我把这个上下文放在里面,我可以假装它是.NET UI线程,然后封回它的“< /p>”。 有安全的方法吗

<最后一件事……为什么C++应用程序似乎在主线程上接收到我的后台线程引发的事件!!它是否值得努力去组织,或者只是让它“神奇地”发生


失去理智,任何帮助都将不胜感激

据我所知,后台线程不同于工作线程。我将忽略测试的这一部分,尽管在没有警告的情况下终止线程是合法的。因此,在我的场景中,您会说这样做就足够了吗?很抱歉,我似乎无法将其格式化为代码:if thread.CurrentThread.GetApartmentState==ApartmentState.STA&!Thread.CurrentThread.IsThreadPoolThread&&Thread.CurrentThread.IsAlive{SynchronizationContext.SetSynchronizationContextnew WindowsFormsSynchronizationContext;}Thread.CurrentThread.IsAlive将始终为真!线程池线程是必需的吗?我的需求是决定我的库的调用方是否是COM客户端,如C++ MFC或VB6,如果是,那么只有在安全的时候,安装回叫的上下文。我很可能是从.Net进程调用的,在这种情况下,如果存在当前的调度程序,我将使用该调度程序,如果需要,则由调用进程自行安装。您实际上只需要检查单元状态。