日期:2014-05-18  浏览次数:20864 次

能否在Form显示出来后不阻塞?
假如我有一个Form,名为Form1,上面放了一个PictureBox,并加载了一个gif动画,在主窗口里面:

  private void btnTest_Click(object sender, EventArgs e)
  {
  Form1 myForm = new 1();
  myForm.Show();
  }
我们看到,Form1正常显示了,动画也动起来了,现在,我们模拟一个需要消耗大量CPU的操作

  private void btnTest_Click(object sender, EventArgs e)
  {
  Form1 myForm = new Form1();
  myForm.Show();
  //阻塞10秒
  Application.DoEvents();
  System.Threading.Thread.Sleep(10000);
  }
我们看到,FORM1显示出来了,但动画不动了,直到10秒以后才动起来,我希望Form1不受下面的影响(因为我是Show而不是ShowDialog),能否做到?
  另外,我用线程做到了希望的效果,但线程的副作用更多,比如Form1闪一下就没了,需要使用循环,直到需要关闭时才结束线程,如果不断执行,半天下来,系统速度就很慢了,等等,因此,我不希望使用多线程.

------解决方案--------------------
用BackgroundWorker试试
------解决方案--------------------
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show();

for (Int32 i = 0; i < 1000 * 10; i++)
{
Application.DoEvents();
System.Threading.Thread.Sleep(1);
}
}
------解决方案--------------------
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void fun()
{
while (true)
{
this.Text = "这里够耗时了吧";
}
}

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show();

System.Threading.Thread t = new System.Threading.Thread(delegate() { fun(); });
t.IsBackground = true;
t.Start();
}
------解决方案--------------------
探讨
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void fun()
{
while (true)
{
this.Text = "这里够耗时了吧";
}
}

privat……

------解决方案--------------------
是不是Application.DoEvents();用错了?为什么要这样模拟。你可以在程序外去消耗cpu啊。
------解决方案--------------------
都说用BackgroundWorker了,虽说它本质上也是多线程,但应该没有lz说的那些毛病。
C# code

private void btnTest_Click(object sender, EventArgs e)
{
    Form1 myForm = new Form1();
    myForm.Show();
    BackgroundWorker bgWorker = new BackgroundWorker();
    bgWorker.DoWork += new DoWorkEventHandler((sender1, e1) => 
    {
        //阻塞10秒
        Application.DoEvents();
        System.Threading.Thread.Sleep(10000);
    });
    bgWorker.RunWorkerAsync();
}

------解决方案--------------------

做异步吧

操作是无法避免的,如果使用sleep不推荐,这是自己骗自己,还不如异步中处理
------解决方案--------------------
探讨

呵呵,SLEEP是模拟某个很耗时的操作,实际项目当然不是sleep,曾经用过线程,但在线程中不断创建/销毁窗体后,半天下来,运行速度慢了很多,因此,想换一个方式.

------解决方案--------------------
多线程绝对是最佳处理方式,不会任何额外麻烦的