我在一个按钮的点击事件中编写下面的代码,并希望ProgressBar& for
循环开始同时协同工作。所以一开始我开始timer1
private void Button_Click(object sender, EventArgs e)
{
this.timer1.Start();
if (comboBox.SelectedIndex == 0)
{
TextBox.Clear();
for (int j = 0; j < N; j++)
for (int i = 0; i < N; i++)
{
TextBox.Text += array[i, j].ToString()+" , " ;
}
}
}
但是当我点击按钮时,首先TextBox开始填充(for
循环工作),然后timer1开始工作,ProgressBar开始递增。
我使用Visual Studio 2010,Windows窗体应用程序并编写timer1
的底部代码:
private void timer1_Tick(object sender, EventArgs e)
{
this.ProgressBar.Increment(1);
}
每个人都可以告诉我如何设置他们同时开始和工作?
答案 0 :(得分:1)
您正在使用在UI线程上运行的System.Windows.Forms.Timer
,当您阻止UI线程时,它将不会执行,直到您的Button_Click方法完成。
您必须直接在for循环中更新ProgressBar(这仍将阻止UI线程并导致应用程序在持续时间内无响应)或者正确地执行此操作您应该创建一个异步工作程序,例如{{ 1}}或System.Threading.Task
并以这样的方式实现它,以便为主线程提供进度更新,这将根据需要更新ProgressBar。
Here是一个关于如何使用BackgroundWorker的简单教程,这可能是更简单的解决方案。
您将在本教程中注意到一个名为System.ComponentModel.BackgroundWorker
的方法,它会更新TextBox。您只需要更改此方法以更新ProgressBar以及TextBox。
答案 1 :(得分:1)
Windows窗体使用单线程消息循环,因此在您的Button_Click
处理程序返回之前,计时器的处理程序将无法运行。阅读Windows消息循环以了解原因。
这里的关键是你永远不应该在事件处理程序中执行长时间运行的任务。您可能已经注意到,在您的代码运行之前,您的窗口会挂起。
要使其正常工作,您可以使用BackgroundWorker
,或自己创建一个帖子。另请注意,如果您在另一个线程上运行长时间运行的任务,则无法直接访问该表单。