Как лучше реализовать задачу?

193
07 марта 2018, 04:57

Есть функция. Туда я бросаю список List<double>, прохожусь по каждому элементу и рассчитываю некоторыми функциями новый массив. Так вот, каждую минуту поступает новый элемент в мой список и необходимо получить новый элемент в новом массиве. Получается, я буду каждый раз рассчитывать заного весь массив, чтобы получить конечный результат, т.к. там предыдущий расчет влияет на следующее значение. Есть ли как-нибудь способ, рассчитать, ждать, пока получу новый элемент, и просто продолжить цикл for уже с новый элементом?

Answer 1

Ваша задача похожа на паттерн producer/consumer. Один участок кода производит данные, другой - потребляет их.

В современном C# очень удобно использовать конвейеры (pipelines).

Упрощённый пример, как это может выглядеть в вашем случае:

class Program
{
    static void Main(string[] args)
    {
        var inputValues = new BlockingCollection<double>();
        var getValues = Task.Run(() =>
        {
            try
            {
                var rnd = new Random();
                for (int i = 0; i < 10; i++)
                {
                    inputValues.Add(rnd.NextDouble());
                    Thread.Sleep(1000);
                }
            }
            finally { inputValues.CompleteAdding(); }
        });
        var processValues = Task.Run(() =>
        {
            foreach (var value in inputValues.GetConsumingEnumerable())
            {
                ProcessValue(value);
            }
        });
        Task.WaitAll(getValues, processValues);
    }
    static void ProcessValue(double value)
    {
        var result = value * 100;
        Console.WriteLine(result);
    }
}

В данном консольном приложении один поток помещает данные в BlockingCollection, другой считывает их по мере поступления и выполняет обработку. Благодаря вызову метода GetConsumingEnumerable второй поток будет сколь угодно долго ждать появления новых данных. До тех пор, пока первый поток не вызовет метод CompleteAdding.

READ ALSO
Перенести вычисления на видеокарту

Перенести вычисления на видеокарту

Есть программа, в которой проводится цикл и в нем параллельные вычисленияВсе вычисления, как я понял, проходят на процессоре, использую всё...

196
Unity3D - Вставка Prefab&#39;a в Prefab

Unity3D - Вставка Prefab'a в Prefab

Возможно ли по средством кода добавить в Prefab другой Prefab? К примеру есть рукоядка топора и одеть на неё лезвие топора?

203
Как сделать так чтобы одна таблица создавалась на основе двух предыдущих?

Как сделать так чтобы одна таблица создавалась на основе двух предыдущих?

Привет!Я разрабатываю для себя приложение на С# с использованием Entity Framework и у меня начало получатся добавлять и выводить данные с базы но мне...

258
Console Application C#

Console Application C#

Как задать минимально возможный размер окна консоли, меньше которого пользователь не сможет её уменьшить?! Спасибо за ответ ;)

218