# Www Xddl Info Introducing Dot Net_2

Chia sẻ: Up Upload | Ngày: | Loại File: PDF | Số trang:45

0
16
lượt xem
3

## Www Xddl Info Introducing Dot Net_2

Mô tả tài liệu

Tham khảo tài liệu 'www xddl info introducing dot net_2', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:

Bình luận(0)

Lưu

## Nội dung Text: Www Xddl Info Introducing Dot Net_2

2. CHAPTER 5 PARALLELIZATION AND THREADING ENHANCEMENTS Stocks.Add(new StockQuote { ID = 7, Company = "Amazon", Price = 20.8m }); Stocks.Add(new StockQuote { ID = 8, Company = "HSBC", Price = 54.6m }); Stocks.Add(new StockQuote { ID = 9, Company = "Barclays", Price = 23.2m }); Stocks.Add(new StockQuote { ID = 10, Company = "Gilette", Price = 1.84m }); } private static void RunInSerial() { for (int i = 0; i < Stocks.Count; i++) { Console.WriteLine("Serial processing stock: {0}",Stocks[i].Company); StockService.CallService(Stocks[i]); Console.WriteLine(); } } private static void RunInParallel() { Parallel.For(0, Stocks.Count, i => { Console.WriteLine("Parallel processing stock: {0}", Stocks[i].Company); StockService.CallService(Stocks[i]); Console.WriteLine(); }); } } Create a new class called StockQuote and add the following code: 3. Listing 5-1. Parallel For Loop public class StockQuote { public int ID {get; set;} public string Company { get; set; } public decimal Price{get; set;} } Create a new class called StockService and enter the following code: 4. public class StockService { public static decimal CallService(StockQuote Quote) { Console.WriteLine("Executing long task for {0}", Quote.Company); var rand = new Random(DateTime.Now.Millisecond); System.Threading.Thread.Sleep(1000); return Convert.ToDecimal(rand.NextDouble()); } } Press F5 to run the code. When I run the code on my machine I receive the output shown in Figure 5-2. 103
3. CHAPTER 5 PARALLELIZATION AND THREADING ENHANCEMENTS Figure 5-2. O utput of parallel for loop against serial processing Are the stock quotes processed incrementally or in a random order? You might have noted that your application did not necessarily process the stock quotes in the order in which they were added to the list when run in parallel. This is because work was divided between the cores on your machine, so it’s important to remember that work might not (and probably won’t) be processed sequentially. You will look at how the work is shared out in more detail when we look at the new task functionality. Try running the code again. Do you get similar results? The quotes might be processed in a slightly different order, and speed increases might vary slightly depending on what other applications are doing on your machine. When measuring performance, be sure to perform a number of tests. Let’s now take a look at the syntax used in the Parallel.For() loop example: System.Threading.Parallel.For(0, Stocks.Count, i => { .. } The Parallel.For() method actually has 12 different overloads, but this particular version accepts 3 parameters: 0 is the counter for the start of the loop. • Stocks.Count lets the loop know when to stop. • i=>: Our friendly lambda statement (or inline function) with the variable i • representing the current iteration, which allows you to query the list of stocks. 104
4. CHAPTER 5 PARALLELIZATION AND THREADING ENHANCEMENTS ParallelOptions Some of the various parallel overloads allow you to specify options such as the number of cores to use when running the loop in parallel by using the ParallelOptions class. The following code limits the number of cores to use for processing to two. You might want to do this to ensure cores are available for other applications. ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 2 }; Parallel.For(0, 100, options, x=> { //Do something }); Parallel.ForEach() Similar to the Parallel.For() loop, the Parallel.ForEach() method allows you to iterate through an object supporting the IEnumerable interface: Parallel.ForEach(Stocks, stock => { StockService.CallService(stock); }); Warning: Parallelization Can Hurt Performance Parallelizing code contains overhead and can actually slow down your code, including when there are loops that run a very small amounts of code in each iteration. Please refer to the following articles about why this occurs: http://msdn.microsoft.com/en-us/library/dd560853(VS.100).aspx • http://en.wikipedia.org/wiki/Context_switch • Parallel.Invoke() The Parallel.Invoke() method can be used to execute code in parallel. It has the following syntax: Parallel.Invoke(()=>StockService.CallService(Stocks[0]), () => StockService.CallService(Stocks[1]), () => StockService.CallService(Stocks[2]) ); When you use Parallel.Invoke() or any of the parallel loops, the parallel extensions are behind the scenes using tasks. Let’s take a look at tasks now. 105