当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET4任务并行库可以使用COM对象吗?分享

时间:2023-04-10 14:07:45 C#

.NET4任务并行库可以使用COM对象吗?它是“这可能吗,如果可能的话,你能给我一个简单的例子吗,因为我在网上找不到一个?”有点问题。我有许多完全独立的(即“令人尴尬的并行”)进程,我想使用C#使用.NETFramework4中的任务并行库并行运行这些进程。其中一些过程需要使用可通过COM/OLE自动化访问的软件。具体来说,有一个Parallel.Foreach()循环将任务与项目列表分开,并基本上调用Parallel.Foreach中的不同函数来处理处理(因此其中一些函数使用COM库来工作)。是否可以?谢谢。使用TPL的COM对象是100%可能的。虽然默认情况下TPL将使用标准的.NETThreadPool,但TPL通过TaskScheduler类有一个扩展点,允许您提供自己的调度程序,可以将工作分派给您创建的线程。在使用COM对象的情况下,首先需要知道COM类是需要STA线程还是MTA线程。如果它是一个MTA线程,您不需要做任何特别的事情,因为COM类已经在任何随机线程中可用。遗憾的是,当您需要使用自定义TaskScheduler时,大多数经典COM对象往往依赖于STA线程,而不管您使用它们的.NET线程是否已初始化为STA兼容线程。虽然TaskScheduler不是一件容易编写的任务,但如果您对线程有基本的了解,它们也很难编写。幸运的是,ParallelExtensionsExtras库已经提供了一个StaTaskScheduler类,因此您甚至不需要自己编写任何东西。PFX团队在这里发表了一篇很棒的博文,讨论了StaTaskScheduler类的实现和一些用例。基本上,您可能希望将新的StaTaskScheduler初始化为某个类的静态变量,然后启动您的任务,指定它们由该实例调度。这看起来像这样://创建调度程序的静态实例,指定一些最大线程数privatestaticreadonlyStaTaskSchedulerMyStaTaskScheduler=newStaTaskScheduler(4);....//然后在启动需要STA线程的任务时指定调度程序Task.TaskFactory.StartNew(()=>{MyComObjectmyComObject=newMyComObject();myComObject.DoSomething();//...等等...},CancellationToken.None,TaskCreationOptions.None,MyStaTaskScheduler);这可能是可能的,但也可能行不通。许多COM对象需要特定的单元线程。当您使用Parallel.For/ForEach时,您是在没有单元线程设置的.NET线程池上运行。这可能有效,并且适用于某些COM对象,但它也可能导致崩溃和难以追踪的奇怪的COMExceptions。我还有一些其他信息需要验证,但这可能会有所帮助。默认任务调度器将使用当前线程做一些工作,然后根据需要从线程池中添加额外的线程。如果在执行Parallel.ForEach时共享COM对象,这可能会导致问题。例如,假设您的主线程是STA。您实例化一个COM对象并使用Parallel.ForEach做一些工作,其中每个线程都尝试访问先前实例化的COM对象。我怀疑它会破裂,初步测试似乎支持这一点。在这种情况下,我至少看到了几个选项:以上是C#学习教程:Canthe.NET4TaskParallelLibraryuseCOMobjects?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: