C#线程从陌生到熟悉(3)
今天我们来谈谈线程池:
应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。通过基础类库中的ThreadPool类提供一个线程池,该线程池可用于发送工作现,处理异步I/O,代表其他线程等待及处理计时器.ThreadPool类的所有方法都是静态方法.ThreadPool本身也是一个静态类.
我们来看看他的定义和一些常用的方法:
public static class ThreadPool
{
[SecuritySafeCritical]
public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads);
[SecuritySafeCritical]
public static void GetMaxThreads(out int workerThreads, out int completionPortThreads);
[SecuritySafeCritical]
public static void GetMinThreads(out int workerThreads, out int completionPortThreads);
[SecuritySafeCritical]
public static bool QueueUserWorkItem(WaitCallback callBack);
[SecuritySafeCritical]
public static bool QueueUserWorkItem(WaitCallback callBack, object state);
}
GetAvailableThreads这个方法返回的最大线程池线程数和当前活动线程数之间的差值。 参数workerThreads: 可用辅助线程的数目。completionPortThreads: 可用异步I/O 线程的数目。
GetMaxThreads方法获得当前由线程池维护的辅助线程的最大数目.参数workerThreads: 线程池中辅助线程的最大数目。completionPortThreads: 当前由线程池维护的空闲异步I/O 线程的最大数目。
GetMinThreads方法获得当前由线程池维护的空闲辅助线程的最小数目.参数workerThreads: 当前由线程池维护的空闲辅助线程的最小数目.completionPortThreads: 当前由线程池维护的空闲异步I/O 线程的最小数目。
QueueUserWorkItem方法将方法排入队列以便执行。参数callBack, 表示要执行的方法.state:包含方法所用数据的对象。
下面看个例子:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace ConsoleApplication6
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Console.WriteLine("主线程进行异步条用");
14
15 AutoResetEvent asyncOpIsDone = new AutoResetEvent(false);
16 ThreadPool.QueueUserWorkItem(new WaitCallback((x) =>
17 {
18
19 Thread.Sleep(1000);
20 Console.WriteLine("工作任务");
21
22 }));
23 string s="我的参数";
24 ThreadPool.QueueUserWorkItem(new WaitCallback((x) =>
25 {
26
27 Thread.Sleep(2000);
28 Console.WriteLine("工作任务1");
29 Console.WriteLine(x);
30
31 }), s);
32 ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation), asyncOpIsDone);
33 Console.WriteLine("主线程执行其他");
34 Console.WriteLine("主线程等待任务处理结束");
35 asyncOpIsDone.WaitOne();
36 }
37 static void MyAsyncOperation(Object state)
38 {
39
40 Thread.Sleep(5000);
41 Console.WriteLine("工作任务2");
42 ((AutoResetEvent)state).Set();
43 }
44 }
45 }
运行的结果为 www.zzzyk.com
这里有个类为AutoResetEvent,他的作用是通知正在等待的线程已发生事件。他是从EventWaitHandle继承而来的!例子中分别用了两种不同的方式调用,第二种是可以传递参数的!工作线程1就传递了"我的参数"字符串!工作线程2运行完了会通知等待的线程已发生事件.这里AutoResetEvent初始化的时候首先将信号设成false,工作线程2如果调用成功,将被设成true. asyncOpIsDone.WaitOne()阻塞当前线程,直到收到信号!
再看下面的例子
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace ConsoleApplication7
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Console.WriteLine("\n当前线程的HashCode:{0}", Thread.CurrentThread.GetHashCode().ToString());
14 Console.WriteLine("当前应用域的名字为:{0}", AppDomain.CurrentDomain.FriendlyName);
15 int workerThreads;
16 int completionPortThreads;
17
18 &
补充:软件开发 , C# ,