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

use*_*679 11 c# com ole .net-4.0 task-parallel-library

这是"这是可能的,如果是这样,你能给我一个简单的例子,因为我找不到一个在线的吗?" 有点问题.

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

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

这可能吗?谢谢.

Dre*_*rsh 18

使用TPL的COM对象是100%可能的.虽然默认情况下TPL将使用标准的.NET ThreadPool,但TPL TaskScheduler类中有一个扩展点,使您能够提供自己的调度程序,可以将工作分派给您创建的线程.

在使用COM对象的情况下,首先需要知道COM类是否需要STA线程或MTA线程.如果是MTA线程,则没有什么特别需要完成的,因为COM类已经可以在任何随机线程中使用.不幸的是,大多数经典的COM对象往往依赖于STA线程,而且当你需要使用自定义时TaskScheduler,无论你使用它们的.NET线程是否已被初始化为STA兼容线程.

虽然TaskSchedulers写起来并不是一件容易的事,但如果你对线程有基本的了解,那么它们写起来并不是那么难.幸运的是,ParallelExtensions Extras库已经提供了一个StaTaskScheduler类,所以你甚至不需要自己编写任何东西.有一个伟大的博客帖子在这里由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);
Run Code Online (Sandbox Code Playgroud)