Lektsia_10VP
.pdfprivate 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