浅述WinForm多线程编程与Control.Invoke的应用
VS2008、C#3.0
在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来。一个最直接的方法便是使用多线程。多线程编程的方式在WinForm开发中必不可少。
本文介绍在WinForm开发中如何使用多线程,以及在线程中如何通过Control.Invoke方法返回窗体主线程执行相关操作。
-. WinForm多线程编程
1. new Thread()
新开一个线程,执行一个方法,没有参数传递:
View Code
1 private void DoWork() { 2 Thread t = new Thread(new ThreadStart(this.DoSomething)); 3 t.Start(); 4 } 5 private void DoSomething() { 6 MessageBox.Show("thread start"); 7 } 8 新开一个线程,执行一个方法,并传递参数: 9 private void DoWork() { 10 Thread t = new Thread(new ParameterizedThreadStart(this.DoSomething)); 11 t.Start("guozhijian"); 12 } 13 private void DoSomething(object o) { 14 MessageBox.Show(o.ToString()); 15 } 参数定义为object类型。
2. ThreadPool
众所周知,新开一个线程代价是很高昂的,如果我们每个操作都新开一个线程,那么太浪费了,于是,下面使用线程池。
无参数传递:
View Code
1 private void DoWork() { 2 ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething)); 3 } 4 private void DoSomething(object o) { 5 MessageBox.Show("thread start"); 6 } 有参数传递: 7 private void DoWork() { 8 ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething), "guozhijian"); 9 } 10 private void DoSomething(object o) { 11 MessageBox.Show(o.ToString()); 12 } 使用匿名方法更灵活: 13 private void DoWork() { 14 string name = "guozhijian"; 15 ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o){ 16 MessageBox.Show(name); 17 })); 18 } 在匿名代码段里面可以直接访问局部变量,不用在关心参数传递的问题
posted on 2012-09-07 15:41 xuejianhui 阅读(177) 评论(0) 编辑 收藏 举报