.NET 4.x Массив потоков. Максимально быстрое выполнение - C#
Формулировка задачи:
Добрый день.
Стоит такая задача:
Максимально быстро циклически выполнять определенный метод в течение некоторого времени.
Сам метод может выполняться 100-300 мс.
В идеале необходимо получать результат выполнения каждую миллисекунду.
То есть нужно получить некое плотное покрытие из результатов с интервалом не более 1 мс.
Реально ли это сделать?
Для проверки сделал такое консольное приложение:
В итоге (см.аттач) получаю результат мгновенно несколько раз подряд, но затем наступает некая циклическая задержка, которая всё портит. Возникают "дыры" в покрытии.
То ли код плохой, то ли это закономерные накладные расходы.
Вот как от нее избавиться не пойму.
Что пробовал:
1) Использовать Task и Parralel.For вместо Thread, раз уж доступен .NET 4.5 - стало только хуже. Видимо оно как-то там само по себе решает как ему оптимальнее выполняться, но задержки только возросли.
2) Помещать цикл в цикл. И пробовал генерить в цикле потоки, которые уже генерят потоки с циклами.
3) Задавать смещение во времени с помощью Thread.Sleep в надежде, что зеленые участки перекроются и я получу хоть какое-то равномерное покрытие.
Ничего не помогло. "Дыры" так и остаются, а их длительность почти не уменьшается.
Бьюсь уже который день. Помогите, пожалуйста!
using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main() { GetTime(); // получаем время начала выполнения программы var threads = new List<Thread>(); for (var i = 0; i++ < 100; ) //сделал так в надежде, что такая инициализация поможет threads.Add(new Thread(Dummy)); //сэкономить время в следующем цикле for (var i = 0; i < 100; i++) threads[i].Start(); Console.Read(); } static void Dummy() { Thread.Sleep(250); //некая функция, которая выполняется около 250 мс GetTime(); //логируем время получения результата } static void GetTime() { Console.WriteLine(DateTime.Now.ToString("ss,fff")); } } }
Решение задачи: «.NET 4.x Массив потоков. Максимально быстрое выполнение»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public static List<Stopwatch> sws = new List<Stopwatch>(); public static List<Thread> threads = new List<Thread>(); static void Main() { for (var i = 0; i < count; i++) { threads.Add(new Thread(Dummy)); sws.Add(new Stopwatch()); } for(int i = 0; i < count; i++) sws[i].Start(); new Thread( () => { for(int i = 0; i < 5; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 5; i < 10; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 10; i < 15; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 15; i < 20; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 20; i < 25; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 25; i < 30; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 30; i < 35; i++) threads[i].Start(i); }).Start(); new Thread( () => { for(int i = 35; i < 40; i++) threads[i].Start(i); }).Start(); Console.Read(); } static void Dummy(object data) { int i = (int)data; Thread.Sleep(250); //некая функция, которая выполняется около 250 мс sws[i].Stop(); Console.WriteLine(sws[i].ElapsedMilliseconds.ToString()); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д