这是一个“这是否可能,如果可能的话,你能给我一个快速的例子吗?因为我在网上找不到。”的问题。
我有许多完全独立(即“尴尬地并行”)的进程,我想使用C#中的.NET Framework 4中的任务并行库并行运行它们。其中一些进程需要使用可以通过COM/OLE自动化访问的软件。
具体来说,有一个Parallel.Foreach()循环,它将任务从项目列表中分割出来,基本上调用Parallel.Foreach内部的不同函数来处理处理(因此其中一些函数使用COM库工作)。
这是否可能?谢谢。
这是一个“这是否可能,如果可能的话,你能给我一个快速的例子吗?因为我在网上找不到。”的问题。
我有许多完全独立(即“尴尬地并行”)的进程,我想使用C#中的.NET Framework 4中的任务并行库并行运行它们。其中一些进程需要使用可以通过COM/OLE自动化访问的软件。
具体来说,有一个Parallel.Foreach()循环,它将任务从项目列表中分割出来,基本上调用Parallel.Foreach内部的不同函数来处理处理(因此其中一些函数使用COM库工作)。
这是否可能?谢谢。
TaskScheduler
类提供了扩展点,使您能够提供自己的调度程序,可以将工作分派到您创建的线程。TaskScheduler
,以便您所使用的任何.NET线程都已初始化为STA兼容线程。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);
这有可能是可行的,但也可能不起作用。
许多COM对象需要特定的单元线程。当您使用Parallel.For/ForEach时,您正在运行.NET线程池,该线程池没有设置单元线程。这可能有效,并且对于某些COM对象可以正常工作,但也可能导致崩溃和奇怪的COM异常,这些异常很难跟踪。
以下是一些我尚未验证但可能有用的额外信息。默认任务调度程序将使用当前线程执行部分工作,然后根据需要从线程池添加其他线程。
如果在Parallel.ForEach中共享COM对象,则可能会出现问题。例如,假设您的主线程是STA。您在该线程上实例化COM对象并使用Parallel.ForEach执行一些工作,其中每个线程都尝试访问先前实例化的COM对象。我怀疑它会崩溃,并且初始测试似乎支持这一点。在这种情况下,我至少看到了几个选择: