拓撲檢查耗時操作在 **UI 執行緒** 同步執行,導致訊息迴圈阻塞,表單無法重繪/響應。
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();
}
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;
}
}
問題描述中提到「在 BackgroundWorker 中創建了全域變量的拓撲過程」,導致 MDB 被鎖定。修正:**拓撲物件應在 DoWork 內部創建並釋放**,不要作為全域/成員變量持有,避免長時間佔用資料庫連接/鎖。