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

C# 多線程操作 Entity Framework 寫入 SQL Server 部署到服務器失敗排查

     編輯:程式設計綜合問答

開發者在本地調試正常的 C# 多線程程序,部署到服務器後報錯「未將對象引用設置到對象的實例」(NullReferenceException)。代碼涉及 Entity Framework(EF)操作數據庫,在線程中調用 BLL 層方法寫入數據。本文分析常見原因並給出排查方向。

問題代碼片段

private bool SaveData(float[] dispVal, ClientDto client) {
    ExtHost h;
    BLL.ExtHostBLL host = new ExtHostBLL();

    h = host.GetHostByHostcode(client.HostId);
    int channelIndex = 1;
    string channelId = "";
    foreach (decimal val in dispVal) {
        if (!host.ExistChannel("通道" + channelIndex, h.Id, out channelId)) {
            channelId = Common.Result.GetNewId();
            host.AddChannel(channelId, "通道" + channelIndex, client.HostId);
        }
        host.AddChannelData(Common.Result.GetNewId(), channelId, val);
        channelIndex++;
    }
    return true;
}

錯誤信息

提示:未將對象引用設置到對象的實例

核心原因分析

這與服務器環境無關,純屬代碼邏輯或依賴注入問題。 常見原因包括:

  1. h 為 null:host.GetHostByHostcode(client.HostId) 查無數據返回 null,後續調用 h.Id 拋出異常。
  2. BLL 內部依賴未初始化:ExtHostBLL 構造函數中若依賴 DbContext、Repository 等未正確注入(特別是多線程下 DbContext 生命周期管理不當),會導致內部字段為 null。
  3. EF DbContext 線程安全問題:DbContext 非線程安全。若多線程共用同一實例,或未在線程內創建新實例,極易出現併發異常或空引用。
  4. 配置文件缺失:服務器缺少連接字符串、EF 配置節,導致上下文創建失敗。

排查建議

  1. 加詳細日誌:在關鍵步驟記錄參數、返回值,定位具體哪一行拋異常。
  2. 檢查 h 是否為 null:
    h = host.GetHostByHostcode(client.HostId);
    if (h == null) { log.Error("Host not found: " + client.HostId); return false; }
  3. 確保每線程獨立 DbContext:在線程方法內部 using (var ctx = new MyDbContext()) 創建並銷毀,不要跨線程共享。
  4. 遠程調試或添加全局異常捕獲:獲取完整堆疊信息,定位到具體方法行號。

最佳實踐

  • 使用依賴注入(DI)容器管理 BLL、Repository 生命周期,避免手動 new。
  • EF Core / EF 6 皆建議採用 每請求/每線程一個 DbContext 模式。
  • 異常處理要記錄完整堆疊(ex.ToString()),而非僅 ex.Message。

結論:不要怪服務器環境,先在本地模擬併發、模擬數據缺失場景單元測試,補全空值判斷與線程隔離,問題自然迎刃而解。

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