winforms 关于在Visual Studio中使用进度栏

ep6jt1vc  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(108)

我想在Winforms项目中添加进度条,但遇到了问题。
在这种情况下,它不会在2秒后关闭

private void button1_Click(object sender, EventArgs e)
    {
        Form1 form1 = new Form1();
        form1.ShowDialog();
        System.Threading.Thread.Sleep(2000);
        form1.Close();
    }

在这种情况下,进度条不会移动

private void button1_Click(object sender, EventArgs e)
    {
        Form1 form1 = new Form1();
        form1.Show();
        System.Threading.Thread.Sleep(2000);
        form1.Close();
    }

请问这个问题怎么解决?或者Visual Studio中有更好的进度条插件吗?

cnwbcb6i

cnwbcb6i1#

在第一种情况下,代码在ShowDialog处阻塞,因此在窗体关闭之前无法执行关闭窗体的行。
在第二种情况下,您正在休眠UI线程2秒,同时期望UI线程更新ProgressBar。你睡着的时候能工作吗?
这里的解决方案是使用另一种形式的Timer。将其Interval设置为2000,然后在其Tick事件处理程序中关闭窗体。这样,您可以调用ShowDialog,这样第一个表单就无法访问,但第二个表单仍将在2秒后关闭。

x759pob2

x759pob22#

jmcilhinney已经解释得很清楚了,你需要很好地理解线程问题。
这里有一个不需要使用计时器的方法,请参考下面的代码:

Form2 form2 = new Form2();
         Task.Factory.StartNew(() =>
         {
             form2.ShowDialog();
         });

         this.Invoke(new Action(() =>
         {
             if (form2 != null)
             {
                 System.Threading.Thread.Sleep(2000);
                 form2.Close();
                 form2.Dispose();
                 form2 = null;
             }
         }));

相关问题