Last active
November 23, 2017 03:50
-
-
Save relyky/c49506f55ce5f8f19bec to your computer and use it in GitHub Desktop.
WinForm防止程式「沒有回應」的小技巧, Application.DoEvents, no response
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// 使用 DoEvents 防止沒有回應 | |
/// </summary> | |
private void button1_Click(object sender, EventArgs e) | |
{ | |
//## 使用 DoEvents 防止沒有回應 | |
for (int i = 0; i <= 999999; i++) | |
{ | |
// ProcessDataPiece[i] | |
label1.Text = i.ToString(); | |
// 處理目前在訊息佇列中的所有Windows訊息。 | |
Application.DoEvents(); | |
} | |
} | |
/// <summary> | |
/// 這段碼將沒有回應 | |
/// </summary> | |
private void button2_Click(object sender, EventArgs e) | |
{ | |
//## 這段碼將沒有回應 | |
for (int i = 0; i <= 999999; i++) | |
{ | |
// ProcessDataPiece[i] | |
label2.Text = i.ToString(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// 使用 BackgroundWorker 防止沒有回應 | |
/// </summary> | |
// resource | |
BackgroundWorker _bgWorker; | |
class _bgWorker_UserState // use to exchange information between main thread and background-worker thread. | |
{ | |
// arguments | |
public int total; | |
// user state | |
public int currentState; | |
// result | |
//... | |
} | |
private void button3_Click(object sender, EventArgs e) | |
{ | |
//## 使用 BackgroundWorker 防止沒有回應 | |
_bgWorker = new BackgroundWorker(); | |
_bgWorker.WorkerReportsProgress = true; | |
_bgWorker.DoWork += _bgWorker_DoWork; | |
_bgWorker.RunWorkerCompleted += _bgWorker_RunWorkerCompleted; | |
_bgWorker.ProgressChanged += _bgWorker_ProgressChanged; | |
//# construct "UserState" to exchange information between main thread and and _bgWorker. | |
_bgWorker_UserState userState = new _bgWorker_UserState(); | |
userState.total = 999999; // set up arguments | |
// go | |
_bgWorker.RunWorkerAsync(userState); | |
} | |
void _bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) | |
{ | |
// parese UserState | |
_bgWorker_UserState userState = (_bgWorker_UserState)e.UserState; | |
// show progress [e.ProgressPercentage] | |
label3.Text = userState.currentState.ToString(); | |
} | |
void _bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) | |
{ | |
// parese Result | |
_bgWorker_UserState userState = (_bgWorker_UserState)e.Result; | |
// show progress | |
label3.Text = "已完成"; | |
} | |
void _bgWorker_DoWork(object sender, DoWorkEventArgs e) | |
{ | |
//# parese Argument | |
_bgWorker_UserState userState = (_bgWorker_UserState)e.Argument; | |
//# go | |
DateTime checkPoint = DateTime.Now; | |
for (int i = 0; i <= userState.total; i++) | |
{ | |
// ProcessDataPiece[i] | |
userState.currentState = i; // update running state | |
// report current progress | |
if (DateTime.Now.Subtract(checkPoint).TotalSeconds >= 1.0) // report interval of 1 second. | |
{ | |
int percentProgress = (int)((double)i / (double)userState.total * 100.0); | |
_bgWorker.ReportProgress(percentProgress, userState); | |
} | |
} | |
// success | |
// take result and will pass to event: _bgWorker_RunWorkerCompleted | |
e.Result = userState; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This APP is available and capable thing.