c# - 如何使用 Parallel.ForEach 从 excel 文件中读取单元格数据
问题描述
我正在使用 Microsoft.Office.Interop.Excel 读取 excel 文件,如下所示:
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(filePath);
Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
Microsoft.Office.Interop.Excel.Range range = sheet.UsedRange;
var rangeValues = range.Value;
List<string> EmailList = new List<string)();
foreach (String str in rangeValues)
{
//addDataToList(EmailList, str); // add value to List<String>
EmailList.Add(str);
}
range.Value 是动态的,所以问题是如何使用 Parallel 从 excel 文件中读取单元格数据?有类似的东西:
// Parallel.ForEach(rangeValues, (str) => { addEmailToList(EmailList, str); });
解决方案
Office 对象模型不是线程安全的,但可以在 Office 解决方案中使用多个线程。Office 应用程序是组件对象模型 (COM) 服务器。COM 允许客户端在任意线程上调用 COM 服务器。对于非线程安全的 COM 服务器,COM 提供了一种串行化并发调用的机制,以便任何时候只有一个逻辑线程在服务器上执行。这种机制称为单线程单元 (STA) 模型。因为调用是序列化的,调用者可能会在服务器忙或正在处理后台线程上的其他调用时被阻塞一段时间。
即,即使您设法并行读取单元格,最好的情况是除了一个线程会阻塞,最坏的情况是您的应用程序会中断。
如果性能是一个问题,我建议找到另一种读取值的方法。应该有其他库可以更快地做到这一点。
推荐阅读
- go - 使用 dlv 调试“go get”
- kubernetes - GKE 资源请求不能低于 100 mCPU
- scala - Scala:下界绑定泛型需要类型不匹配 _$1
- c++ - 为什么在代码正确时使用加法运算符添加两个稀疏矩阵并非每次都有效(部分正如 egs 所建议的那样)
- arrays - RestAssured 返回数组而不是字符串
- post - Blazemeter chrome 扩展不记录我的所有请求
- r - 在ggplot中创建部分曲线
- nuxt.js - 如何在 nuxt.config 中调用 post API generate()
- ruby-on-rails - 我应该使用 Web Sockets 吗?
- python - 根据拆分后拆分的字符串中的元素过滤行(熊猫)