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

C# ArcEngine 拓撲檢查導致 UI 假死:BackgroundWorker 正確異步處理

     編輯:程式設計綜合問答

原因

拓撲檢查耗時操作在 **UI 執行緒** 同步執行,導致訊息迴圈阻塞,表單無法重繪/響應。

解決:BackgroundWorker / Task.Run

private void btnCheckTopology_Click(object sender, EventArgs e) {
    btnCheckTopology.Enabled = false;
    progressBar.Visible = true;

    var worker = new BackgroundWorker();
    worker.DoWork += (s, e) => {
        // 耗時拓撲檢查邏輯
        e.Result = PerformTopologyCheck(); // 返回結果物件
    };
    worker.RunWorkerCompleted += (s, e) => {
        progressBar.Visible = false;
        btnCheckTopology.Enabled = true;
        if (e.Error != null) MessageBox.Show("錯誤: " + e.Error.Message);
        else BindResultGrid(e.Result);
    };
    worker.RunWorkerAsync();
}

關鍵點

  • **不可在 DoWork 中直接操作 UI 控制項** (如 `grid.Rows.Add`),需透過 `ReportProgress` + `ProgressChanged` 或 `RunWorkerCompleted` 返回結果再綁定。
  • 若用 .NET 4.5+,**Task + async/await** 更簡潔:
private async void btnCheckTopology_Click(object sender, EventArgs e) {
    btnCheckTopology.Enabled = false;
    try {
        var result = await Task.Run(() => PerformTopologyCheck());
        BindResultGrid(result);
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    } finally {
        btnCheckTopology.Enabled = true;
    }
}

原始碼具體 Bug

問題描述中提到「在 BackgroundWorker 中創建了全域變量的拓撲過程」,導致 MDB 被鎖定。修正:**拓撲物件應在 DoWork 內部創建並釋放**,不要作為全域/成員變量持有,避免長時間佔用資料庫連接/鎖。

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