0

我在一个按钮的单击事件中编写了下面的代码,并希望 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);
}

每个人都可以告诉我如何将它们设置为同时启动和工作吗?

4

2 回答 2

1

您正在使用System.Windows.Forms.Timer在 UI 线程上运行的 a,并且当您阻塞 UI 线程时,它在您的 Button_Click 方法完成之前不会执行。

您必须直接从 for 循环中更新 ProgressBar(这仍会阻塞 UI 线程并导致您的应用程序在持续时间内无响应)或正确执行此操作,您应该创建一个异步工作器,例如 aSystem.Threading.Task或 aSystem.ComponentModel.BackgroundWorker并实现它例如向主线程提供进度更新,主线程将根据需要更新 ProgressBar。

是一个关于如何使用 BackgroundWorker 的简单教程,这可能是更简单的解决方案。

您会在本教程中注意到一个名为bw_ProgressChanged更新 TextBox 的方法。您只需更改此方法以更新您的 ProgressBar 以及您的 TextBox。

于 2013-10-15T20:58:47.590 回答
1

Windows 窗体使用单线程消息循环,因此在您Button_Click的处理程序返回之前,计时器处理程序将无法运行。阅读 windows 消息循环以了解原因。

这里的关键是您永远不应该在事件处理程序中执行长时间运行的任务。您可能已经注意到,在您的代码运行之前,您的窗口会一直挂起。

要使其正常工作,您可以使用BackgroundWorker,或自己启动一个线程。另请注意,如果您在另一个线程上运行长时间运行的任务,它无法直接访问表单。

查看这篇旧的 msdn 文章

于 2013-10-15T21:02:07.223 回答