![](/user_photo/2706_HbeT2.jpg)
Lektsia_10VP
.pdfЧтобы во время выполнения превратить дополнительный поток в фоновый, необходимо установить свойство:
thread1.IsBackground = true;
11
Распараллеливание.
Библиотеки Task Parallel Library (TPL) и Concurrency and Coordination Runtime (CCR).
Parallel LINQ (PLINQ).
Новые инструменты отладки и профилирования.
Структуры координации данных.
12
![](/html/2706/21/html_K6XW2ww9ja.dECl/htmlconvd-9psR8113x1.jpg)
Многопоточность не означает распараллеливание!
13
Многопоточность и параллелизм увеличивают сложность приложения
•Состояние гонок.
•Взаимные блокировки.
•Зависание потоков.
•Трудность кодирования и отладки.
•Интеграция в среду.
14
Код, который выиграет от параллельного выполнения, должен обладать следующими характеристиками:
1.Может быть разбит на самодостаточные единицы.
2.Не имеет зависимостей от общего разделяемого состояния.
Параллельные циклы
•Parallel.For ()
•Parallel.ForEach ()
15
Parallel.For()
1. Введите в Program.cs следующий код:
using System;
using System.Collections.Generic; using System.Diagnostics;
using System.Threading.Tasks; namespace HelloParallel
{
class Program
{
public static List<StockQuote> Stocks = new List<StockQuote>();
static void Main(string[] args)
{
double serialSeconds = 0; double parallelSeconds = 0; Stopwatch sw = new Stopwatch();
16
PopulateStockList();
sw = Stopwatch.StartNew(); RunInSerial();
serialSeconds = sw.Elapsed.TotalSeconds;
sw = Stopwatch.StartNew(); RunInParallel();
parallelSeconds = sw.Elapsed.TotalSeconds;
Console.WriteLine(
"Finished serial at {0} and took {1}", DateTime.Now, serialSeconds);
Console.WriteLine(
"Finished parallel at {0} and took {1}", DateTime.Now, parallelSeconds);
17
Console.ReadLine();
sw = Stopwatch.StartNew(); RunInParallel(2); Console.WriteLine(
"Finished parallel at {0} and took {1}", DateTime.Now, sw.Elapsed.TotalSeconds);
Console.ReadLine();
}
private static void PopulateStockList()
{
Stocks.Add(new StockQuote { ID = 1, Company = "Microsoft", Price = 5.34m });
Stocks.Add(new StockQuote { ID = 2, Company = "IBM", Price = 1.9m });
Stocks.Add(new StockQuote { ID = 3, Company = "Yahoo", Price = 2.34m });
Stocks.Add(new StockQuote { ID = 4, Company = "Google", Price = 1.54m });
18
Stocks.Add(new StockQuote { ID = 5, Company = "Altavista", Price = 4.74m });
Stocks.Add(new StockQuote { ID = 6, Company = "Ask", Price = 3.21m });
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 });
}
19
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();
});
}
20