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

大家帮帮忙吧,C# winform UI线程的问题
问题如下:
  在一个按钮事件中,需要执行一个ShowData(),但是这个很费时的,为了让用户感觉到程序在执行
--在这个按钮事件中让一个PictrueBox的图片显示(动态Gif)  
但是我试了很多次,就是不行,必须要等到ShowData中的MessageBox弹出后才能显示这个图片
在网上找了些资料说把耗时的代码放到BeginInvoke的委托中,图片显示代码放到按钮事件中去
我试了 还是不行 ,按说这个应该很多程序都有这个,但是我确实卡在这了,大家鄙视我吧~~
怎么才能做到我按下去图片显示,运行完毕 图片消失啊?大家帮帮我吧
代码如下
C# code

   private delegate void PicImage();
   Thread th1;
   private void btn_Start1_Click(object sender, EventArgs e)
        {
            th1 = new Thread(new ThreadStart(StartTh1));
            th1.Start();
            ShowData();//费时的代码
        }
        public void StartTh1()
        {
            BeginInvoke(new PicImage(ShowImge));
        }
        public void ShowImge()
        {
            Bitmap bmp = new Bitmap(@"F:\WorkSpace\DONET\ForeignTrader\ForeignTrader\imgs\run.gif",true);
            this.pictureBox1.Image = bmp;
            this.pictureBox1.Refresh();
            this.pictureBox1.Visible = true;
        }
        public void ShowData()//费时的代码
        {
           
            string url = this.tb_url1.Text.Trim();

            if (url.IndexOf(Uri.SchemeDelimiter) < 0)
            {
                url = string.Format("{0}{1}{2}",Uri.UriSchemeHttp,Uri.SchemeDelimiter,url);
            }
            string x = GetHtml(url);
          
              if (x.Contains("CSDN"))
                     MessageBox.Show("true");
                 else
                    MessageBox.Show("false");
                 this.pictureBox1.Visible = false;
     
        }




------解决方案--------------------
把 ShowData放到线程或异步方法中去,定时器不是线程,一样会阻塞
------解决方案--------------------
void ShowImg();
void HideImg();

private void Button_Click(object sender,EventArgs e)
{
ShowImg()
Thread t = new Thread(ShowData)
t.Start()
}

void ShowData()
{
//'''''''
HideImg();
}

注意HideImg()里面要使用Control.Invoke方法