多线程与UI操作
2012-04-01 12:34
381 查看
什么是UI线程?
所有的 .NET Framework 应用程序都是使用单线程创建的,单线程用于执行该应用程序, 在.net winform开发中,这样的线程创建并管理用户界面 (UI),因而称为 UI 线程。
什么是UI假死?
当winfrom程序在执行一个长时间耗时的任务时,应用程序出现不能点击、移动,看起来是程序已经死掉的现象(其实还在跑);
改进代码
现在运行程序时, 应用程序就不会出现假死的情况了。当然这不是很好的解决方法,如果要修改多个控件的话,就要新建多个像write那样的方法了,这样代码反而不好阅读了。 解决方式就是用匿名方法,开始动手
修改
编译,还是会报错,无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 ,这是神马情况 ,google一下原因后,原来Invoke第一个参数接受的是delegate类型,而不是具体的委托类型,所以CLR无法知道是哪种委托,继续修改,将delegate转换为具体的委托
所有的 .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(); });
相关文章推荐
- 多线程操作UI控件——DataGridView假死现象
- C#多线程编程(4)-多线程与UI操作
- 关于多线程中涉及UI操作,导致UI线程阻塞问题
- 多线程与UI操作
- 多线程编程(4):多线程与UI操作 .
- 在多线程中进行UI操作
- 多线程编程(4):多线程与UI操作
- Swing中多线程操作UI
- 多线程操作UI
- 在多线程中进行UI操作
- 多线程问题 ----- UI视图 & NSTimer 同时执行操作
- C#编程:多线程与UI操作
- WinForm 多线程操作UI
- 多线程操作UI
- C#多线程编程(4)-多线程与UI操作
- 详解Android中多线程中UI操作
- C# this.invoke()作用 多线程操作UI
- android多线程与UI操作
- 在多线程中进行UI操作--ios学习笔记
- C#多线程编程(1) —— 多线程与UI操作