前言:使用winform觸發一個事件後執行的代碼,如果耗時非常長,則會導致視窗界面假死! 本人最近通過winform窗體執行一項:需要批量更新一批資料庫的數據的操作的任務時,由於數據量達到百萬級別,非常耗時,只能慢慢更新,慢慢執行。 但是,在執行的過程遇到了一個奇葩的問題:窗體在調試狀態下,代碼可以 ...
前言:使用winform觸發一個事件後執行的代碼,如果耗時非常長,則會導致視窗界面假死! 本人最近通過winform窗體執行一項:需要批量更新一批資料庫的數據的操作的任務時,由於數據量達到百萬級別,非常耗時,只能慢慢更新,慢慢執行。
但是,在執行的過程遇到了一個奇葩的問題:窗體在調試狀態下,代碼可以慢慢迴圈執行,沒出現異常。 但是我單獨運行EXE程式時,就必現:程式假死,未響應狀態。
後臺百度雖然沒有找到直接的答案,但是也發現了原因:是因為在操作非常耗時時,程式會出現假死,解決方法也很簡單:在你的耗時方法里,加上非同步處理,不要讓程式一直等待你的執行結果。
如下代碼:
通過,非同步Task.Run方法,讓方法快速結束,不用登臺中間即為耗時的操作更新過程,通過這樣改造後,界面再也不卡死了,完美解決。
/// <summary> /// 臨時方法-用於刷用戶地址手機號數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnUpdateUserAddressPhone_Click(object sender, EventArgs e) { this.txtActionInfomation.Text = $"方法開始"; this.txtActionInfomation.Update(); Task.Run(() => { //耗時代碼 do { //我的更新代碼,需要分頁獲取並更新資料庫,耗時長 //... //... this.txtActionInfomation.Text = $"已更新X條數據"; this.txtActionInfomation.Update(); } while (true); }); this.txtActionInfomation.Text = $"方法結束"; this.txtActionInfomation.Update(); }