5天不再惧怕多线程 --第一天 尝试Thread.docx_第1页
5天不再惧怕多线程 --第一天 尝试Thread.docx_第2页
5天不再惧怕多线程 --第一天 尝试Thread.docx_第3页
5天不再惧怕多线程 --第一天 尝试Thread.docx_第4页
5天不再惧怕多线程 --第一天 尝试Thread.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5天不再惧怕多线程第一天 尝试Thread 转至:/huangxincheng/archive/2012/03/14/2395279.html 原本准备在mongodb之后写一个系列,不过这几天用到多线程时才发现自己对多线程的了解少之又少,仅仅停留在lock上面,故这几天看了下线程参考手册结合自己的心得整理一下放在博客上作为自己的学习笔记。 好了,我们知道“负载”是一个很时尚,很牛X的玩意,往大处说,网站需要负载,数据库需要负载。往小处说,线程也需要负载,面对海量的用户请求,我们的单线程肯定扛不住,那么怎么办,一定要负载,所以说多线程是我们码农必须要熟练掌握的一门技术。 在framework中给我们提供了一个Threading命名空间,下面是一个msdn上不完整的截图:在后面的系列中我也是主要整理这几个类的使用方法和应用场景。一:Thread的使用 我们知道这个类代表处理器线程,在Thread中有几个比较常用和重要的方法。 sleep: 这个算是最简单的了。 join: 这个可以让并发行处理变成串行化,什么意思呢?上代码说话最清楚。 1 class Test 2 3 static void Main() 4 5 Thread t = new Thread(Run); 6 7 t.Start(); 8 9 /Join相当于把Run方法内嵌如此10 t.Join();11 12 /该死的t.Join(),害的我主线程必须在你执行完后才能执行。13 Console.WriteLine(我是主线程: + Thread.CurrentThread.GetHashCode();14 15 16 static void Run()17 18 /等待5s19 Thread.Sleep(5000);20 21 Console.WriteLine(我是线程: + Thread.CurrentThread.GetHashCode();22 23 Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区别的。 Interrupt: 抛出的是ThreadInterruptedException 异常。 Abort: 抛出的是 ThreadAbortException 异常。 Interrupt:如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个 contine操作。 Abort:这个就是相当于一个break操作,工作线程彻底死掉。Interrupt: 1 namespace Test 2 3 class Program 4 5 static void Main(string args) 6 7 Thread t = new Thread(new ThreadStart(Run); 8 9 t.Start();10 11 /阻止动作12 t.Interrupt();13 14 Console.Read();15 16 17 static void Run()18 19 for (int i = 1; i = 3; i+)20 21 Stopwatch watch = new Stopwatch();22 23 try24 25 watch.Start();26 Thread.Sleep(2000);27 watch.Stop();28 29 Console.WriteLine(第0延迟执行:1ms, i, watch.ElapsedMilliseconds);30 31 catch (ThreadInterruptedException e)32 33 Console.WriteLine(第0延迟执行:1ms,不过抛出异常, i, watch.ElapsedMilliseconds);34 35 36 37 38 Abort: 工作线程直接退出,不带走一片云彩。 1 namespace Test 2 3 class Program 4 5 static void Main(string args) 6 7 Thread t = new Thread(new ThreadStart(Run); 8 9 t.Start();10 11 Thread.Sleep(100);12 13 /阻止动作14 t.Abort();15 16 Console.Read();17 18 19 static void Run()20 21 for (int i = 1; i = 3; i+)22 23 Stopwatch watch = new Stopwatch();24 25 try26 27 watch.Start();28 Thread.Sleep(2000);29 watch.Stop();30 31 Console.WriteLine(第0延迟执行:1ms, i, watch.ElapsedMilliseconds);32 33 catch (ThreadAbortException e)34 35 Console.WriteLine(第0延迟执行:1ms,不过抛出异常, i, watch.ElapsedMilliseconds);36 37 38 39 40 二:线程使用场景 可能线程的使用有点类似wcf,做一些耗时但不很及时的需求,比如可以开线程下图片,连接数据库等等,当然线程可以用来做负载,这里就做一个小demo,找一个美女网站,面对如此多的图片,一个线程真的吃不消啊,看了下网站主体上有4个tab页,那么我们就开4个线程来负载 1 class Program 2 3 static void Main(string args) 4 5 string str = model, sexy, belle, stars ; 6 7 for (int url = 0; url 10; purl-) 21 22 for (int pageSize = 0; pageSize 20; pageSize+) 23 24 try 25 26 if (pageSize = 0) 27 url = / + category + / + purl + .html; 28 else 29 url = / + category + / + purl + _ + pageSize + .html; 30 31 /创建http链接 32 var request = (HttpWebRequest)WebRequest.Create(url); 33 34 request.Timeout = 1000 * 5; /5s过期 35 36 var response = (HttpWebResponse)request.GetResponse(); 37 38 Stream stream = response.GetResponseStream(); 39 40 StreamReader sr = new StreamReader(stream); 41 42 string content = sr.ReadToEnd(); 43 44 var list = GetHtmlImageUrlList(content); 45 46 WebClient client = new WebClient(); 47 48 string directory = C:MM, D:MM, E:MM, F:MM ; 49 50 var directoryName = directorynew Random().Next(0, directory.Length); 51 52 if (!Directory.Exists(directoryName) 53 Directory.CreateDirectory(directoryName); 54 55 var fileName = string.Empty; 56 57 if (list.Count = 0) 58 59 Console.WriteLine(时间: + DateTime.Now + 当前网址: + url + 未发现图片); 60 break; 61 62 63 try 64 65 66 fileName = category + _ + purl + _ + (pageSize + 1) + .jpg; 67 68 var localFile = directoryName + fileName; 69 70 var imageRequest = (HttpWebRequest)WebRequest.Create(list0); 71 72 imageRequest.Timeout = 1000 * 5; /5s 超时 73 74 var imageResponse = (HttpWebResponse)imageRequest.GetResponse(); 75 76 var s = imageResponse.GetResponseStream(); 77 78 Image image = Image.FromStream(s); 79 80 image.Save(localFile); 81 82 image.Dispose(); 83 84 Console.WriteLine(时间: + DateTime.Now + 图片: + fileName + 已经下载 存入磁盘位置: + localFile); 85 86 87 catch (Exception e) 88 89 Console.WriteLine(时间: + DateTime.Now + 当前图片: + fileName + 错误信息: + e.Message); 90 continue; 91 92 93 catch (Exception ex) 94 95 Console.WriteLine(时间: + DateTime.Now + 当前网址: + url + 错误信息: + ex.Message); 96 97 98 99 100 101 / 102 / 取得HTML中所有图片的 URL。 103 / 104 / HTML代码 105 / 图片的URL列表 106 public static List GetHtmlImageUrlList(string sHtmlText)107 108 / 定义正则表达式用来匹配 img 标签 109 Regex regImg = new Regex(imgb*?bsrcstrn*=strn*?strn*(?strn*)*?/?strn*, RegexOptions.IgnoreCase);110 111 / 搜索匹配的字符串 112 MatchCollection matches = regImg.Matches(sHtmlText);113 114 List sUrlList = new List();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论