您的位置:首页 > 产品设计 > UI/UE

多线程与UI操作

2012-04-01 12:34 381 查看
什么是UI线程?

  所有的 .NET Framework 应用程序都是使用单线程创建的,单线程用于执行该应用程序, 在.net winform开发中,这样的线程创建并管理用户界面 (UI),因而称为 UI 线程。

什么是UI假死?

  当winfrom程序在执行一个长时间耗时的任务时,应用程序出现不能点击、移动,看起来是程序已经死掉的现象(其实还在跑);

改进代码

private void add()
{
int i = 0;
while (true)
{
i++;
if (label1.InvokeRequired)
{
label1.Invoke(new Action<string>(write), i.ToString());
}
else
{
label1.Text = i.ToString();
}
this.label1.Text = i.ToString();
Thread.Sleep(1000);
}
}

private void write(string str)
{

label1.Text = str;
}


  现在运行程序时, 应用程序就不会出现假死的情况了。当然这不是很好的解决方法,如果要修改多个控件的话,就要新建多个像write那样的方法了,这样代码反而不好阅读了。 解决方式就是用匿名方法,开始动手

  修改

label1.Invoke(delegate() { this.label1.Text = i.ToString(); });


  编译,还是会报错,无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 ,这是神马情况 ,google一下原因后,原来Invoke第一个参数接受的是delegate类型,而不是具体的委托类型,所以CLR无法知道是哪种委托,继续修改,将delegate转换为具体的委托

  

label1.Invoke((MethodInvoker)delegate() { this.label1.Text = i.ToString(); });


  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: