我是LINQ的新手,尤其是PLINQ。我在ms-officeinterop中玩得很开心,发现当使用PLINQ时,即使COM应该将我所有的并行调用封送到一个线程,我的代码也明显快了一倍(取决于查询速度((https://learn.microsoft.com/en-us/visualstudio/vsto/threading-support-in-office?view=vs-2019(。
现在我对这里可能发生的事情感到困惑。我没有遇到com服务器繁忙或类似的异常,即使是在非常大的工作簿上。
Dim oWb as Excel.Workbook
oWb.Worksheets.Cast(Of Excel.Worksheet).AsParallel().Where(Function(x) x.Names.Count > 0).SelectMany(Function(x) x.Names.Cast(Of Excel.Name)).Where(Function(y) y.Name.StartsWith("abc"))
这里的常规方法是循环所有工作表,并在所有工作表上循环。Names集合。
我知道那是一本工作手册。Names属性也存在,此代码只是显示一个查询作为示例。
我读到可以在Excel中使用PLINQ查询(https://devblogs.microsoft.com/pfxteam/plinq-and-office-add-ins/)但我不知道interop是否也是如此。
我的问题是:现在这种并行查询可以与office interop一起使用吗?这样做安全吗
从多个线程访问基于STA的Office应用程序是不安全的。否则,主机应用程序(例如Outlook(在检测到跨线程调用时可能会引发异常。我建议从Excel对象模型中提取数据,然后才并行运行PLINQ查询或对该数据的任何辅助线程。它不依赖于互操作技术本身,而是依赖于COM服务器实现——无论是STA还是MTA。