首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 多執行緒處理 Word 表格:效能提升與資源衝突避坑

     編輯:程式設計疑難解答

場景:遍歷 Word 模板多個表格,逐儲存格操作

多執行緒可行性分析

你的理解基本正確:將「遍歷表格」拆分為多個任務並行,理論上可線性縮短耗時(受限於 CPU 核心數、記憶體頻帶、COM 介面序列化)。

實際阻礙:COM 物件單執行緒套間 (STA)

  • Word Interop (Microsoft.Office.Interop.Word) 物件為 STA,無法真正並行。多執行緒同時呼叫會強制序列化,甚至拋 COMException (RPC_E_WRONG_THREAD)。
  • 檔案鎖定:同一 .docx 無法被多進程/執行緒同時寫入。

替代方案:Open XML SDK / ClosedXML / NPOI

  • 純 .NET 解析 .docx (OOXML),無 COM 依賴,支援真正多執行緒並行讀寫 XML 部分。
  • 效能比 Interop 快 10-100 倍,適合伺服器端批次處理。

Open XML 並行處理範例

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Threading.Tasks;

var files = Directory.GetFiles(inputDir, "*.docx");
Parallel.ForEach(files, file => {
    using (var doc = WordprocessingDocument.Open(file, true)) {
        var tables = doc.MainDocumentPart.DocumentBody.Descendants<Table>();
        foreach (var table in tables) {
            // 並行處理每個表格的行/儲存格
            Parallel.ForEach(table.Descendants<TableRow>(), row => {
                foreach (var cell in row.Descendants<TableCell>()) {
                    // 修改 cell 內容
                }
            });
        }
        doc.MainDocumentPart.Document.Save();
    }
});

效能優化優先序

  1. 換用 Open XML SDK(消除 COM 瓶頸)。
  2. 演算法優化:減少 XPath 查詢、合併寫入、避免重複 Save。
  3. 再考慮多執行緒(Parallel.ForEach、PLINQ、Task.Run)。

「先優化演算法與工具選型,再加並行」是通用真理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved