大家帮帮忙吧,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方法