0

我是 LINQ 的新手,尤其是 PLINQ。我在 ms office interop 中玩耍,非常惊讶地发现,当使用 PLINQ 时,我的代码显着(取决于查询速度提高了一倍)更快,即使 COM 应该将我所有的并行调用编组到单个线程(https: //docs.microsoft.com/en-us/visualstudio/vsto/threading-support-in-office?view=vs-2019)。

现在我对这里可能发生的事情感到困惑。即使在非常大的工作簿上,我也没有遇到 com server is busy 或类似的异常。

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 集合。

我知道 Workbook.Names 属性也存在,此代码只是为了显示一个查询作为示例。

我读到可以在 Excel 中使用 PLINQ 查询(https://devblogs.microsoft.com/pfxteam/plinq-and-office-add-ins/),但我不知道这是否同样适用于互操作。

我的问题:这种并行查询现在可以与办公室互操作一起使用吗?这样做安全吗?

4

1 回答 1

0

从多个线程访问基于 STA 的 Office 应用程序是不安全的。否则,如果宿主应用程序(例如 Outlook)检测到跨线程调用,它可能会引发异常。我建议从 Excel 对象模型中提取数据,然后才在此数据上并行运行 PLINQ 查询或任何辅助线程。而且它不依赖于互操作技术本身,而是依赖于 COM 服务器实现——无论是 STA 还是 MTA。

于 2021-12-23T16:00:15.423 回答