从本质上讲,异步处理和并发处理都是基于多线程。在.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.如果其中出现未处理的异常,会导致这个子线程异常终止,而主线程不会收到任何通知。
原文:http://www.cnblogs.com/xami/p/3588146.html