现在的位置: 首页 > 综合 > 正文

SmartClient学习(四):使用多线程创建高响应智能客户端应用程序

2012年09月23日 ⁄ 综合 ⁄ 共 1851字 ⁄ 字号 评论关闭

SmartClient(智能客户端)笔记四,主要学习了VS2005对多线程程序开发的支持,WebCast系列课程中的第七讲:使用多线程创建高响应智能客户端应用程序.所谓多线程,程序开发者都应该知道,每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务.通常由操作系统负责多个线程的调度和执行.

一 多线程

1.基本概念(简略)

只有当确实需要时才使用处理器

不要使用轮询的方式来同步线程

使用同步对象

多线程增加了应用程序的复杂性

2.创建和终止线程

托管对象构建在Windows基本线程模型之上,System.Threading.Thread类封装了Windows线程功能:
a.创建线程:
b.启动线程
启动线程非常容易,但是代价“昂贵”
Thread myThread= new Thread(newThreadStart(MyWorkerThread));
myThread.Start();

c.设置线程优先级

d.挂起 / 恢复线程执行

e.终止线程:
当所有的线程都结束时,该应用程序才能够被终止.(即使UI关闭,只要有前台线程在继续,该程序仍然在运行).在应用程序终止前,所有前台线程都必须要终止.
可以采用不同方法来终止线程
使用Boolean(实例)变量
使用后台线程
使用 Thread.Abort (强制引发异常来执行)
使用 Thread.Join 来获知线程何时终止(等待线程结束)

二 线程内更新UI控件

1.Control.Invoke

a 控件应该只被创建它们的线程更新

b 使用Control.Invoke来从其他线程委托更新控件

c 同步和异步Invoke方法均可用

d 支持参数传递

e 当从其它线程更新UI控件时,会抛出异常

2.绝对不要直接更新UI控件(记得貌似VC6.0支持直接更新)

private void WorkerThread()
{
statusBar1.Text = "WorkerThreadactive";
while (!workerThreadDone)
{
Thread.Sleep(1000);
}
}

3.正确方法:使用Control.(Begin)Invoke替代

private delegate void LabelUpdater (string labelText);
private void WorkerThread()
{
LabelUpdaterlblUpdater= new LabelUpdater(UpdateLabel);
this.Invoke(lblUpdater, new object[] {"WorkerThreadactive"});
while (!workerThreadDone)
{
Thread.Sleep(1000);
}
}
private void UpdateLabel(stringlabelText)
{
label1.Text = labelText;
}

三 线程与线程池(ThreadPool)

采用通常方式来创建线程代价非常昂贵,对于生命周期相对短的线程使用线程池.
线程池由公共语言运行时(CLR)应用,支持:Threading.Timer对象和异步操作.
ThreadPool性能

1. 由于线程池线程可以被重用,因此当线程池中存在空闲线程时创建线程所带来的开销非常小

2. 如果线程池中没有空闲线程存在,则创建新的线程(当线程池内线城池小于25个线程时),其代价与CreateThread相同

3. 如果线程池中的线程空闲一段时间(通常是60秒),那么该线程将会从池中移除,释放其所占资源

四 线程安全与同步对象

线程安全

1. 多线程访问对象可能会引发问题

2. 读取不一致数据

3. 两个线程可能会同时更新数据,导致产生出错误的结果

4. 使用同步对象来创建线程安全类

5. 只有需要并发访问的类才需要线程安全

同步对象

线程通常来讲不能自治,需要开发者进行协调处理,我们可以使用下列同步对象:

1. Interlocked

2. AutoResetEvent

3. ManualResetEvent

4. Monitor

5. Mutex

五 总结

多线程,大家都知道在程序开发中很重要,除了大学时曾经用VC6.0做过一次做程序作业,以后的工作项目再也没有涉及.然而,多线程在智能客户端中开发尤为重要,以前的三个笔记都不是智能客户端的核心,从这篇笔记开始,逐渐学习智能客户端的一些主要实现方法.

抱歉!评论已关闭.