Skip to content

Instantly share code, notes, and snippets.

@relyky
Last active November 23, 2017 03:50
Show Gist options
  • Save relyky/c49506f55ce5f8f19bec to your computer and use it in GitHub Desktop.
Save relyky/c49506f55ce5f8f19bec to your computer and use it in GitHub Desktop.
WinForm防止程式「沒有回應」的小技巧, Application.DoEvents, no response
/// <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();
}
}
/// <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;
}
@Jemie15
Copy link

Jemie15 commented Oct 14, 2015

This APP is available and capable thing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment