gpt4 book ai didi

c# - .NET 4 任务并行库可以使用 COM 对象吗?

转载 作者:可可西里 更新时间:2023-11-01 08:38:20 28 4
gpt4 key购买 nike

这是一个“这可能吗,如果可以的话,你能给我一个简单的例子吗,因为我在网上找不到一个?”类似的问题。

我有许多完全独立的(即“令人尴尬的并行”)进程,我想使用 C# 在 .NET Framework 4 中使用 Task Parallel 库并行运行这些进程。其中一些流程需要使用可通过 COM/OLE 自动化访问的软件。

具体来说,有一个 Parallel.Foreach() 循环从项目列表中划分任务,基本上调用 Parallel.Foreach 内部的不同函数来处理处理(因此其中一些函数使用 COM 库来工作).

这可能吗?谢谢。

最佳答案

通过 TPL 使用 COM 对象是 100% 可能的。虽然默认情况下 TPL 确实会使用标准的 .NET 线程池,但 TPL 有一个扩展点 the TaskScheduler class这使您能够提供自己的调度程序,该调度程序可以将工作分派(dispatch)给您创建的线程。

在使用 COM 对象的情况下,您首先需要知道 COM 类是否需要 STA 线程或 MTA 线程。如果是 MTA 线程,则没有什么特别需要做的,因为 COM 类已经可以从任何随机线程使用。不幸的是,大多数经典的 COM 对象往往依赖于 STA 线程,这时您需要使用自定义 TaskScheduler,以便您从中使用它们的任何 .NET 线程都是 initialized as an STA compatible thread .

虽然 TaskScheduler 编写起来并不简单,但如果您对线程有基本的了解,那么编写它们也不是那么难。幸好the ParallelExtensions Extras library已经提供了一个 StaTaskScheduler 类,所以您甚至不需要自己编写任何东西。有 a great blog post here由 PFX 团队讨论 StaTaskScheduler 类的实现和一些用例。

但基本上,您需要将一个新的 StaTaskScheduler 初始化为某个类中某处的静态变量,然后开始您的 Tasks 并指定它们由那个例子。这看起来像这样:

// Create a static instance of the scheduler specifying some max number of threads
private static readonly StaTaskScheduler MyStaTaskScheduler = new StaTaskScheduler(4);

....

// Then specify the scheduler when starting tasks that need STA threading
Task.TaskFactory.StartNew(
() =>
{
MyComObject myComObject = new MyComObject();

myComObject.DoSomething();

// ... etc ...
},
CancellationToken.None,
TaskCreationOptions.None,
MyStaTaskScheduler);

关于c# - .NET 4 任务并行库可以使用 COM 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4963136/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com