winform进程间操作UI控件
2015-07-19 22:52
435 查看
一,问题说明。
当在主线程之外新建一个线程之后,我们想通过新建线程修改主界面控件的属性等操作,此时,Windows会报错,提示进程间操作UI无效。
二,解决方法。
1,并不高明的做法,有一定作用,并不推荐。
2,利用委托来进行操作。相当于在新建进程和主进程间出现了一个第三方,这个第三方把新建进程的需求传递给主进程,然后主进程执行。
3,考虑有参数的方法情况
当在主线程之外新建一个线程之后,我们想通过新建线程修改主界面控件的属性等操作,此时,Windows会报错,提示进程间操作UI无效。
二,解决方法。
1,并不高明的做法,有一定作用,并不推荐。
public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false;//这种设置相当于让vs同意这样进程间操作 }
2,利用委托来进行操作。相当于在新建进程和主进程间出现了一个第三方,这个第三方把新建进程的需求传递给主进程,然后主进程执行。
//无参数的方法 private void button1_Click(object sender, EventArgs e)//按钮事件中新建线程 { ThreadStart threadstart = new ThreadStart(dosomething); Thread mythread = new Thread(threadstart); mythread.Start(); } delegate void mydelegate(); //委托方法 public void dosomething() //新线程中需要做的事情 { if (this.InvokeRequired) { this.Invoke(new mydelegate(dosome)); } else { } } public void dosome()//实际操作UI的方法,通过委托执行 { button1.Text = "Hellow C#"; }
3,考虑有参数的方法情况
private void button1_Click(object sender, EventArgs e) { Thread mythread = new Thread(new ParameterizedThreadStart(dosomething));//新建线程,关联该线程将要执行的方法 mythread.Start("Hellow C#"); } delegate void mydelegate(string str); public void dosomething(object obj) { if (this.InvokeRequired) { this.Invoke(new mydelegate(dosome),obj); } else { } } public void dosome(string str) { button1.Text = str; } }
相关文章推荐
- iOS开发——UI进阶篇(一)UITableView,索引条,汽车数据展示案例
- php中的register_shutdown_function和fastcgi_finish_request
- hdu 4740 The Donkey of Gui Zhou bfs
- 浅谈break 、continue、return,goto四种语句的区别。
- 浅谈break 、continue、return,goto四种语句的区别。
- 每天一个小知识点7( 4000 jQuer总结一)
- Ueditor实现自定义conttoller请求或跨域请求
- liunx命令3 attr、lsattr;特殊权限suid、sgid、sticky
- 12100 Printer Queue(优先队列)
- HDU 3998 Sequence
- mui 搜索框图标左对齐
- Arduino初探:让 Arduino 闪起来
- Printer Queue
- UI界面 view的常用属性
- Android UI界面适配
- 观察者模式的具体应用——通知(notification)机制和KVO(Key-Value-Observing)机制
- .NET C#: NameValueCollection
- 我的Android进阶之旅------>Android <requestFocus />标签的用法
- Splay树(插入、删除、区间最大字段和)—— SPOJ - GSS6 Can you answer these queries VI
- leetCode(44):Implement Stack using Queues