多線程執行,加快使用者的體感
多做不一定是好事,有時會讓使用者體感更慢
最近有寫一隻程式
是做即時運算佣金的功能
使用者反應很慢
看一下原本的code是逐筆讀取資料再逐筆更新
把它改成整批作業
1次讀取就計算好並更新
上線後
使用者反應沒有變快
但是依SQL來追踨是有比較快的
後來再查看
原來在更新計算時
會另外出現等待視窗並鎖定畫面
計算完後
等待視窗才消失
把等待視窗取消
使用者就覺得快很多
但是
使用者在等得計算時會手動誤KEY資料
所以
還是要用等待畫面去鎖定
也通知使用者更新時別動
最後決定用TASK去執行更新
使用非同步操作執行長時間運行的操作
把等待視窗留在主程序中
等計算完成再更新 UI,確保在主 UI 線程上執行
CODE很簡單如下
private void button1_Click(object sender, EventArgs e)
{
MESSAGESHOW MSGSHOW = new MESSAGESHOW();
// 鎖定控制項
this.Enabled = false;
// 顯示跳出視窗
MSGSHOW.Show();
// 使用非同步操作執行長時間運行的操作
Task.Run(() =>
{
// 計算佣金
SETMONEYS_NEW(dateTimePicker1.Value.ToString("yyyyMMdd"));
// 更新 UI,確保在主 UI 線程上執行
Invoke(new Action(() =>
{
// 查詢本日來車資料
SEARCH(dateTimePicker1.Value.ToString("yyyyMMdd"));
// 查詢本日的合計
SETNUMS(dateTimePicker1.Value.ToString("yyyyMMdd"));
label29.Text = "更新時間" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
// 關閉跳出視窗
MSGSHOW.Close();
// 解除鎖定
this.Enabled = true;
}));
});
}
自我LV~