读书人

大家帮帮忙吧C# winform UI线程的有

发布时间: 2012-05-08 22:09:41 作者: rapoo

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

读书人网 >C#

热点推荐