"VisualizerConsoleApplication":
(рис 25.1)
System.Threading и System.Threading.Task, для работы с потоками. В итоге должно получиться следующее:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VisualizerConsoleApplication
{
class Program
{
static void Main(string[] args)
{
}
}
}
Program два статичных метода: DoSomething() в котором будет вызываться метод Thread.SpinWait();
ParallelLoop(), в котором перебираются числа от 0 до 1000 (созданные с помощью метода Enumerable.Range()) c использованием цикла foreach. В цикле foreach вызовем метод DoSomething().В итоге должно получиться следующее:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VisualizerConsoleApplication
{
class Program
{
static void DoSomething()
{
Thread.SpinWait(int.MaxValue / 10);
}
static void ParallelLoop()
{
var numbers = Enumerable.Range(0, 1000);
foreach (var number in numbers)
{
DoSomething();
}
}
static void Main(string[] args)
{
}
}
}
Main() - метод ParallelLoop(), в отдельном потоке. Код будет выглядеть следующим образом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VisualizerConsoleApplication
{
class Program
{
static void DoSomething()
{
Thread.SpinWait(int.MaxValue / 10);
}
static void ParallelLoop()
{
var numbers = Enumerable.Range(0, 1000);
foreach (var number in numbers)
{
DoSomething();
}
}
static void Main(string[] args)
{
new Thread(new ThreadStart(ParallelLoop)).Start();
Console.ReadLine();
}
}
}
Currency Visualizer. Для этого в меню Debug выбрать пункт "Start Performance Analysis" или можно использовать сочетание клавиш Alt+F2 (Для использования Currency Visualizer, VIsual Studio 2010 должна быть запущена с правами администратора)
(рис 25.2)
Concurrency и выбрать в нем два пункта "Collect resource contention data" и "Visualize the behavior of a multithreaded application" и для продолжения работы мастера кнопку Next:
(рис 25.3)
(рис 25.4)
"Launch profiling after the wizard finish", после чего нажмите кнопку "Finish":
(рис 25.5)
"Stop Profiling" через 10-15 секунд:
(рис 25.6)
(рис 25.7)
"Cores". Отобразиться график, который показывает дисбаланс нагрузки на логические ядра процессора:
(рис 25.8)
ParallelLoop() - заменим цикл foreach на Parallel.ForEach:
static void ParallelLoop()
{
var numbers = Enumerable.Range(0, 1000);
Parallel.ForEach(numbers, (number) =>
{
DoSomething();
});
}
(рис 25.9)
"CPU Utilization". На данном графике отображается использование процессора с работающим приложением (в нашем случае приложение использует 54%):
(рис 25.10)
sync (который будет использоваться для синхронизации lock):
static void Main(string[] args)
{
new Thread(new ThreadStart(ParallelLoop)).Start();
object sync = new object();
new Thread(new ThreadStart(() =>
{
lock (sync)
{
Thread.Sleep(2000);
}
})).Start();
new Thread(new ThreadStart(() =>
{
lock (sync)
{
Thread.Sleep(2000);
}
})).Start();
Console.ReadLine();
}
Примечание: ключевое слово lock не позволит одному потоку войти в раздел кода в тот момент, когда в нем находится другой поток.
"Threads":
(рис 25.11)
На диаграмме можно видеть два зависимых потока, один из потоков запускается с сегмента синхронизации (Thread.Sleep(2000)).
Листинг кода программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VisualizerConsoleApplication
{
class Program
{
static void DoSomething()
{
Thread.SpinWait(int.MaxValue / 10);
}
static void ParallelLoop()
{
var numbers = Enumerable.Range(0, 1000);
Parallel.ForEach(numbers, (number) =>
{
DoSomething();
});
}
static void Main(string[] args)
{
new Thread(new ThreadStart(ParallelLoop)).Start();
object sync = new object();
new Thread(new ThreadStart(() =>
{
lock (sync)
{
Thread.Sleep(2000);
}
})).Start();
new Thread(new ThreadStart(() =>
{
lock (sync)
{
Thread.Sleep(2000);
}
})).Start();
Console.ReadLine();
}
}
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.