xuejianhui

导航

浅述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编辑  收藏  举报