DEV小结-多线程(2)

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

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

例1  

 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         }

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

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             });

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

 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         }

 

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

转载于:https://www.cnblogs.com/xami/p/3588146.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值