使用多个线程

时间:2016-12-26 07:50:40

标签: c# excel multithreading interop

我正在使用c#VSTO和Interop lib来开发excel加载项。用于在将这些值粘贴到具有格式的另一个工作簿之前验证每个单元格的值。我的实际查询是用一些标准处理(以最快的方式)单元格。

我使用了WorkSheet.Cells.SpecialCells()来获取我感兴趣的Excel.Range对象,并使用线程同时处理Excel.Range(由SpecialCells()返回)。 以下是一些观察/问题:

  1. 似乎Excel.Range无法根据偏移和长度进行拆分(即我无法根据某些偏移和计数从现有范围中获取新的Range对象)
  2. 如果我们在线程中共享范围对象并尝试处理不同批次中的单元格,则会出现以下异常: “消息过滤器指示应用程序正忙。(HRESULT异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))”这也使得该批单元未经处理。
  3. 解决上述问题的任何输入或指示都会有所帮助。还有关于快速处理大型excel文件的任何建议,比如几秒钟(这是目前最大的瓶颈)

1 个答案:

答案 0 :(得分:2)

Excel本质上是一个单线程应用程序(从技术上讲,COM对象位于单线程单元中)。这意味着任何COM访问都会自动编组到主线程,因此使用额外的线程进行COM调用没有任何好处。

对于您的用例,将整个数据数组放入Range.Value的单个调用中然后进一步处理此数组而不使用额外的COM调用是有意义的。

您可能还需要查看this question有关如何快速读取和写入范围数据的想法,包括使用Excel C API的示例。

另一种方法是直接读取Excel数据文件,而不是与Excel应用程序交互。为此,您可以使用基于xml的文件格式(如ClosedXML)的高级包装器。