呼叫 Web Service 一次性取回 100,000 筆訂單,易導致:
本文提出 多執行緒分段拉取 策略:將 10 萬筆拆為 10 執行緒 × 1 萬筆,流水線式並行處理。

pageIndex/pageSize 或 startId/endId。XmlSerializer.Deserialize 直映射物件,比 XmlDocument 遍歷或 DataSet 填充更高效 (未實測,經驗值)。ThreadPool.QueueUserWorkItem 或 Parallel.ForEach (NET 4+) 配合 SemaphoreSlim 限制並發數。
const int Total = 100_000;
const int PageSize = 10_000;
const int MaxDegree = 5; // 視頻寬/服務端承受力調整
var partitions = Enumerable.Range(0, (Total + PageSize - 1) / PageSize)
.Select(i => new { Start = i * PageSize, Count = PageSize });
var options = new ParallelOptions { MaxDegreeOfParallelism = MaxDegree };
Parallel.ForEach(partitions, options, part =>
{
try
{
var xml = WebServiceClient.GetOrders(part.Start, part.Count); // 呼叫 WS
var orders = DeserializeOrders(xml); // XmlSerializer -> List
SaveToLocalDb(orders); // 批次入庫
Log.Info($"Partition {part.Start}-{part.Start+part.Count} done.");
}
catch (Exception ex)
{
Log.Error(ex, $"Partition {part.Start} failed, will retry...");
// 重試邏輯...
}
});
| 痛點 | 優化手段 |
|---|---|
| 服務端單點瓶頸 | 服務端同樣分頁查詢 + 資料庫索引優化;考慮 Read Replica 分流 |
| 網路抖動導致重傳 | 啟用 WS-ReliableMessaging 或應用層 Checkpoint (記錄已完成分段 ID) |
| 資料一致性 | 若需事務一致性,採用「暫存表 + 最後合併」或分散式事務 (MSDTC) |
| 進度監控 | 共享 ConcurrentDictionary 記錄各分段進度,UI 輪詢顯示 |