Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lektsia_10VP

.pdf
Скачиваний:
4
Добавлен:
27.05.2015
Размер:
724.2 Кб
Скачать

private static void RunInParallel(int DegreeOfParallelism)

{

ParallelOptions options = new ParallelOptions

{ MaxDegreeOfParallelism = DegreeOfParallelism }; Parallel.For(0, Stocks.Count, options, i =>

{

Console.WriteLine(

"Parallel processing stock: {0}",Stocks[i].Company); StockService.CallService(Stocks[i]); Console.WriteLine();

});

}

}

}

3. Создайте новый класс по имени StockQuote и поместите в него следующий код:

21

namespace HelloParallel

{

public class StockQuote

{

public int ID { get; set; }

public string Company { get; set; } public decimal Price { get; set; }

}

}

4. Создайте новый класс StockService и введите в него следующий код:

using System;

namespace HelloParallel

{

public class StockService

{

public static decimal CallService(StockQuote Quote)

{

22

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

}

}

}

Теперь рассмотрим синтаксис, использованный в примере цикла Parallel.For():

System.Threading.Parallel.For (0, Stocks.Count, i => {})

ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 2 };

Parallel.For(0, 100, options, x =>

{

//Какая-то обработка

});

23

Parallel.ForEach()

Parallel.ForEach(Stocks, stock =>

{

StockService.CallService(stock);

});

Parallel.Invoke()

Parallel.Invoke(() => StockService.CallService(Stocks[0]), () => StockService.CallService(Stocks[1]), () => StockService.CallService(Stocks[2]));

24

Задачи

25

Создание новой задачи

Пространство имен System.Threading.Tasks

Task task1 = Task.Factory.StartNew(

() => Console.WriteLine("hello task 1"));

Task task2 = new Task(() => Console.WriteLine("hello task 2")); task2.Start();

Task.Wait () и Task.WaitAll ()

26

Task task1 = Task.Factory.StartNew(

() => Console.WriteLine("hello task 1"));

Task task2 = new Task(() => Console.WriteLine("hello task 2"), TaskCreationOptions.LongRunning);

Task task3 = Task.Factory.StartNew(

() => Console.WriteLine("hello task 3"));

Task task4 = Task.Factory.StartNew(

() => Console.WriteLine("hello task 4"));

task2.Start();

task1.Wait();

Task.WaitAll(task2, task3, task4);

27

Рис. 5.4. Поток выполнения в примере использования

Task.Wait()

28

Task.WaitAny(task1, task2, task3, task4);

while (task1.IsCompleted == false)

{

Console.WriteLine("Waiting on task 1");

}

Task task3 = Task.Factory.StartNew(

() => Console.WriteLine("hello task 1"))

.ContinueWith((t) => Console.WriteLine("hello task 2"))

.ContinueWith((t) => Console.WriteLine("hello task 3"))

.ContinueWith((t) => Console.WriteLine("hello task 4"));

.ContinueWith((t) => System.Diagnostics.Trace.Write(

"I will be run"), TaskContinuationOptions.OnlyOnFaulted);

29

Возврат значений из задач

var data = Task.Factory.StartNew(() => GetResult()); Console.WriteLine(

"Parallel task returned with value of \"{0}\"", data.Result);

В качестве альтернативы можно применить тип

Task<T>:

Task<string> t = new Task<string>(() => GetResult()); t.Start();

Console.WriteLine(

"Parallel task returned with value of \"{0}\"", t.Result);

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]