C#线程池基础

C#线程池基础

ID:45755757

大小:58.61 KB

页数:16页

时间:2019-11-17

C#线程池基础_第1页
C#线程池基础_第2页
C#线程池基础_第3页
C#线程池基础_第4页
C#线程池基础_第5页
资源描述:

《C#线程池基础》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C#线程池基础池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器屮放置一些资源,在用的时候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了儿百毫秒。我们要这么想,对于一个高并发的环境来说,每一秒假设有100个请求,每个请求需要使用(开和关)10个线程,也就是一秒需要处理1000个线程的开和关,每个线程独立堆栈1M,可以想象在这一

2、秒屮内存分配和回收是多么夸张,这个开销不能说不昂贵。首先,要理解线程池线程分为两类工作线程和10线程,可以单独设置最小线程数和最大线程数:ThreadPool.SetMinThreads(2,2);ThrcadPool.SctMaxThrcads(4,4);最大线程数很好理解,就是线程池最多创建这些线程,如果最大4个线程,现在这4个线程都在运行的话,后续进来的线程只能排队等待了。那么为什么有最小线程一说法呢?其实之所以使用线程池是不希望线程在创建后运行结束后理解冋收,这样的话以后要用的吋候还需要创建,我们可以让线程池至少保留几个线程,即使没有线程在工作

3、也保留。上述语句我们设置线程池一开始就保持2个工作线程和2个10线程,最大不超过4个线程。至于线程池的使用相当简单先来看一段代码:for(inti二0;i〈totalThreads;i++){ThreadPool.QueueUserWorkltem(o=>{Thread.Sleep(1000);inta,b;ThreadPool.GetAvailableThreads(outa,outb);Console.WriteLine(string.Format(z,({0}/{1})#{2}:{3}〃,a,b,Thread・CurrcntThrcad・Mana

4、gcdThrcadld,DateTime.Now・ToStringC'ninKss”)));});Console.WriteLine(,zMainthreadfinished");Console・ReadLineO;代码里面用到了一个事先定义的静态字段:staticreadonlyinttotalThrcads=10;代码运行结果如下:[亡二GWINDOWSsystem32cmd^xe■Mainthreadfinished(2/4〉tt4:24:16(2/4〉U3:24:16tt3:24:17tt4:24:17(15:24:1

5、7<«/4>"6:24:17:24:18ns:24:18”3:24:18(3/4〉■離6:24:18每一个线程都休眠一秒然后输出当前线程池可用的工作线程和10线程以及当前线程的托管1D和时间。我们通过这段代码可以发现线程池的儿个特性:1)线程池中的线程都是后台线程,如果没有在主线程使用ReadLine的话,程序马上会退出。2)线程池一开始就占用了2个线程,一秒后占用了4个线程,工作线程将会由3-6四个线程來处理。3)线程池最多使用了4个工作线程和0个10线程。那么,我们如何知道线程池中的线程都运行结束了呢,可以想到上文用过的Moni

6、tor结构:Stopwatchsw=Stopwatch.StartNewO;for(inti=0;i{Thread.Sleep(lOOO);inta,b;ThreadPool.GetAvailableThreads(outa,outb);Console.WriteLine(string.Format(/z({0}/{1})#{2}:{3}〃,a,b,Thread.CurrentThread.ManagedThreadld,DateTime.Now.To

7、String(z,mm:ss〃)));lock(locker)runningThreads--;Monitor.Pulse(locker);});}lock(locker){whi1e(runningThreads>0)Monitor.Wait(1ockcr);}Console.WriteLine(sw.ElapsedMilliseconds);Console.ReadLine();程序中用到了两个辅助字段:staticobjcctlocker=newobjeet();staticintrunningThreads=totalThreads;程序运行结

8、果如下:

9、C:WINDOWSsysteni32cii>(Lexe<2/4〉«429:50

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。