.NET 4.x Массив потоков. Максимально быстрое выполнение - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. Стоит такая задача: Максимально быстро циклически выполнять определенный метод в течение некоторого времени. Сам метод может выполняться 100-300 мс. В идеале необходимо получать результат выполнения каждую миллисекунду. То есть нужно получить некое плотное покрытие из результатов с интервалом не более 1 мс. Реально ли это сделать? Для проверки сделал такое консольное приложение:
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"));
        }
    }
}
В итоге (см.аттач) получаю результат мгновенно несколько раз подряд, но затем наступает некая циклическая задержка, которая всё портит. Возникают "дыры" в покрытии. То ли код плохой, то ли это закономерные накладные расходы. Вот как от нее избавиться не пойму. Что пробовал: 1) Использовать Task и Parralel.For вместо Thread, раз уж доступен .NET 4.5 - стало только хуже. Видимо оно как-то там само по себе решает как ему оптимальнее выполняться, но задержки только возросли. 2) Помещать цикл в цикл. И пробовал генерить в цикле потоки, которые уже генерят потоки с циклами. 3) Задавать смещение во времени с помощью Thread.Sleep в надежде, что зеленые участки перекроются и я получу хоть какое-то равномерное покрытие. Ничего не помогло. "Дыры" так и остаются, а их длительность почти не уменьшается. Бьюсь уже который день. Помогите, пожалуйста!

Решение задачи: «.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());
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы