我正在尝试创建一个在点击计算按钮时显示的进度条。并运行直到执行完成该过程。我正在使用后台工作人员进行操作。进度条只是一个简单的选取框,所以如果进程结束,我想撕掉虚假的可见属性。
这是初始化
backgroundworker1 = new System.ComponentModel.BackgroundWorker();
backgroundworker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
所以首先点击计算按钮:
private void buttonCalculate_Click(object sender, EventArgs e)
{
//execute the background worker
this.backgroundworker1.RunWorkerAsync();
while (this.backgroundworker1.IsBusy)
{
progressBar1.Visible=true;
Application.DoEvents();
}
}
这是backgroundworker1_DoWork事件
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
connection = new MySqlConnection(prop.connectionString);
string query = "Call telephelyi_2013()";
if (this.OpenConnection() == true)
{
MySqlCommand cmd = new MySqlCommand();
cmd = connection.CreateCommand();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
}
最后当操作合并时,它应该这样做
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = false;
MessageBox.Show("Számítás befejzve!");
}
但毕竟当我运行程序并单击计算按钮时,显示的进度条和刚刚移动的进度条永远不会结束。而且我也看到计算机正在计算一段时间后停止但是我从来没有得到那个结束的消息!
怎么了?
答案 0 :(得分:1)
你需要启动后台工作者然后放手,而不是通过等待工作者来阻止主线程。使用DoEvents
只是一个黑客攻击会导致更多的问题,除非你非常熟悉它的作用,它是如何工作的,以及什么时候应该使用它。
只需点击按钮即可:
this.backgroundworker1.RunWorkerAsync();
progressBar1.Visible=true;
瞧。