首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Web Service 大量資料傳輸解決方案:多執行緒分批串流處理

     編輯:ASP.NET 基礎

Web Service 單次回傳大量資料(如 10 萬筆以上)易導致逾時、記憶體飆升、序列化效能差。本文提出**多執行緒分批拉取 + 實體物件反序列化**的流程設計,平衡效能與穩定度。

架構流程圖

大量資料傳輸流程圖

核心流程說明

  1. 執行緒 1 發起請求,取得第一批資料(如 1 萬筆)
  2. 資料成功取得後,介面進入閒置狀態
  3. 啟動 執行緒 2 取得下一批資料,**同時執行緒 1 處理上一批資料的後續工作**(反序列化、入庫、轉換)
  4. 採用**預先定義實體類別 + XML 反序列化**,據稱比 `XmlDocument` 遍歷、`DataSet` 載入更高效(未實測)
  5. 處理完成後結束執行緒 1,循環啟動下一個執行緒,直到所有資料處理完畢

關鍵技術點

1. 分批請求參數設計

[WebMethod]
public string GetDataBatch(int batchIndex, int batchSize)
{
    // 查詢對應範圍資料,序列化為 XML 回傳
    var data = Repository.GetBatch(batchIndex, batchSize);
    return SerializeToXml(data);
}

2. 客戶端多執行緒協調

// 簡化邏輯示意
int totalBatches = GetTotalBatches();
var tasks = new List<Task>();

for (int i = 0; i < totalBatches; i++)
{
    int batch = i;
    tasks.Add(Task.Run(() => 
    {
        string xml = Client.GetDataBatch(batch, 10000);
        var entities = DeserializeXml<List<Entity>>(xml);
        ProcessAndSave(entities);
    }));
}

Task.WaitAll(tasks.ToArray());

3. XML 反序列化為實體物件

[XmlRoot("Entities")]
public class Entity
{
    [XmlElement("Id")] public int Id { get; set; }
    [XmlElement("Name")] public string Name { get; set; }
    // ...
}

public static List<T> DeserializeXml<T>(string xml)
{
    using (var sr = new StringReader(xml))
    {
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(sr);
    }
}

優缺點分析

優點缺點/風險
避免單次大封包傳輸逾時執行緒管理複雜度高
記憶體壓力分散(逐批處理)資料一致性需自行保證(交易、冪等)
可平行化處理提升吞吐Web Service 端需支援分頁/游標查詢
實體物件強型別,開發體驗好錯誤處理、重試、進度追蹤需自建

現代替代方案(強烈建議)

  • gRPC / Web API + 分頁:標準化、支援串流、效能優異
  • ODATA / GraphQL:客戶端按需查詢,伺服器端分頁
  • 訊息佇列:生產者推送、消費者拉取,天然削峰填谷
  • 檔案傳輸:超大資料集改為 SFTP/Blob 儲存 + 通知機制

遷移建議

若維護舊版 ASMX Web Service 專案,此方案可作為過渡優化;新專務請直接採用 RESTful API + 分頁/游標 + 非同步串流,架構更清晰、生態工具更豐富。

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