C#线程、多线程、线程池、后台线程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#线程、多线程、线程池、后台线程
System.Threading 命名空间
System.Threading 命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和数据访问的类(Monitor、Interlocked、AutoResetEvent 等)之外,此命名空间还包含一个ThreadPool 类(它使用户能够使用系统提供的线程池)和一个Timer 类(在线程池线程上执行回调方法)。除了System.Threading 命名空间中提供的功能之外,BackgroundWorker 类还提供一个简单的基于事件的方法,以同步对主应用程序线程的访问。
Thread 类
一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。托管线程的执行单位是方法。使用ThreadStart 委托或ParameterizedThreadStart 委托可以指定由线程执行的方法。使用ParameterizedThreadStart 委托可以将数据作为参数传递到线程过程。
您不需要自己创建线程。BackgroundWorker 和ThreadPool 类使您可以通过一种面向任务的简单方式来使用系统管理的后台线程。对于将结果返回用户界面(UI) 线程的后台任务,最简单的编程方法是使用BackgroundWorker 类。下表列出了有关各种并发编程的一些信息来源。
任务请参见
执行使用事件来与主应用程序线程通信的
BackgroundWorker
后台任务。
托管线程池
执行不需要与主应用程序线程通信的后台
任务。
保护代码或字段区域,使其不被并发访问。Monitor;Visual Basic SyncLock语句(在C# 中
为lock语句)
同步多个线程的活动。EventWaitHandle、AutoResetEvent 和
ManualResetEvent
按固定的时间间隔在后台执行代码。Timer
按固定的时间间隔在UI 线程上执行代
DispatcherTimer
码。
提供对数据的无锁并发访问。互锁操作
创建您自己的线程。Thread类;启动时创建线程并传递数据
ThreadPool 类
提供一个线程池,该线程池可用于发送工作项、处理异步I/O、代表其他线程等待以及处理计时器。线程池通过为应用程序提供一个由系统管理的辅助线程池,使您可以更为有效地使用线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的每个进程都有一个线程池。线程池的默认大小为:每个处理器250 个辅助线程,再加上1000 个I/O 完成线程。
BackgroundWorker 类
在单独的线程上运行操作。
BackgroundWorker 类允许您在单独的专用线程上运行操作。诸如下载和数据库事务这样的耗时操作会导致用户界面停止响应。如果您需要能进行响应的用户界面,而且必须执行耗时操作,则可以使用BackgroundWorker 类方便地解决问题。
若要在后台运行操作,请创建一个BackgroundWorker。可以侦听报告操作进度并在操作完成时发出信号的事件。
若要设置后台操作,请为DoWork 事件添加事件处理程序。在此事件处理程序中调用耗时的操作。若要启动后台操作,请调用RunWorkerAsync 方法。若要收到进度更新的通知,请处理ProgressChanged 事件。若要在操作完成时收到通知,请处理RunWorkerCompleted 事件。
说明:
您必须非常小心,确保在DoWork 事件处理程序中不操作任何用户界面对象。而应该通过ProgressChanged 和RunWorkerCompleted 事件与用户界面进行通信。
如果后台操作需要参数,请在调用RunWorkerAsync 时给出参数。在DoWork 事件处理程序内部,可以从DoWorkEventArgs.Argument 属性中提取该参数。