能否在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();
}
------解决方案--------------------
------解决方案--------------------是不是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不推荐,这是自己骗自己,还不如异步中处理
------解决方案--------------------
------解决方案--------------------
多线程绝对是最佳处理方式,不会任何额外麻烦的