首页 > 其他 > 详细

DEV小结-多线程(2)

时间:2014-03-09 07:08:25      阅读:545      评论:0      收藏:0      [点我收藏+]

从本质上讲,异步处理和并发处理都是基于多线程。在.net framework 4中用Task,Parallel可以很方便的使用多线程实现并发和异步。

并发处理代码。 将0-99的集合中每个数值+10保存到另一个List<int>中,用Thread.Sleep模拟每个并发线程处理时间长短不同。那么由于并发的特点,最终在result的结果是无序的。下面有对应的同步处理的foreach代码。有时候可以在调试的时候用同步处理,而运行的时候用并发处理。

例1  

bubuko.com,布布扣
 1         static void Main(string[] args)
 2         {
 3             int count = 100;
 4             List<int> collection = new List<int>();
 5             var rand = new Random();
 6             var result = new List<int>();
 7             for (int i = 0; i < count; i++)
 8             {
 9                 collection.Add(i);
10             }
11 
12         //用于控制并发线程数量
13             ParallelOptions op = new ParallelOptions();
14             op.MaxDegreeOfParallelism = Environment.ProcessorCount * 2;
15             Parallel.ForEach(collection, op, p => {
16 
17                 result.Add(p + 10);
18                 Thread.Sleep(TimeSpan.FromMilliseconds(rand.Next(100, 200)));
19             });
20 
21             //同步处理代码,result中的顺序与collection中一致
22             //foreach (var item in collection)
23             //{
24             //    result.Add(p + 10);
25             //    Thread.Sleep(TimeSpan.FromMilliseconds(rand.Next(100, 200)));
26             //}
27 
28         }
bubuko.com,布布扣

异步处理代码。
这样就可以创建一个子线程处理一些逻辑,比如I/O操作,向硬盘写文件。在写文件的同时,主线程会继续向下执行,并不会因为这个I/O操作而暂停主线程等等操作完成。
例2        

bubuko.com,布布扣
1             Task.Factory.StartNew(() => { 
2             
3                 //to do sth.
4                 //using(var fw = new StreamWriter(@"c:\test1.txt"))
5                 //{
6                 //    fw.Write("write sth to local file.");
7                 //}
8             });
bubuko.com,布布扣

还有一种情况见下面代码。
创建一子线程做异步处理,主线程需要用到异步处理的结果。这里主线程会在创建子线程后继续去执行“do other thing”的程序。当需要用到子线程处理结果的时候,子线程的处理还没有结束的话,会等待,直到异步处理返回结果后在继续后面的逻辑。
例3

bubuko.com,布布扣
 1         static void Main(string[] args)
 2         {
 3             string result = string.Empty;
 4             var t =Task.Factory.StartNew<string>(() => { 
 5             
 6                 //to do sth.
 7                 Thread.Sleep(10000);
 8                 return "result";
 9             });
10             // do other things.
11             Console.WriteLine(t.Result);
12         }
bubuko.com,布布扣

 

这里有一点需要注意,特别是没有返回结果的例2.如果其中出现未处理的异常,会导致这个子线程异常终止,而主线程不会收到任何通知。

DEV小结-多线程(2),布布扣,bubuko.com

DEV小结-多线程(2)

原文:http://www.cnblogs.com/xami/p/3588146.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!