Есть функция. Туда я бросаю список List<double>, прохожусь по каждому элементу и рассчитываю некоторыми функциями новый массив. Так вот, каждую минуту поступает новый элемент в мой список и необходимо получить новый элемент в новом массиве. Получается, я буду каждый раз рассчитывать заного весь массив, чтобы получить конечный результат, т.к. там предыдущий расчет влияет на следующее значение. Есть ли как-нибудь способ, рассчитать, ждать, пока получу новый элемент, и просто продолжить цикл for уже с новый элементом?
Asked
Active
Viewed 108 times
0
Fresto
- 1,158
1 Answers
3
Ваша задача похожа на паттерн 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.
Alexander Petrov
- 29,233
-
1Да лааадно, как всё просто оказывается, а я тут разбираюсь в каждой функции, пытаюсь сделать так, чтобы расчет проводился конкретно по 1 элементу, выбираю, сколько нужно элементов в массиве иметь, чтобы получить результат. А в итоге вот так всё просто может быть) Огромное спасибо вам за помощь, это слишком упростит мою работу!) – Fresto Mar 06 '18 at 10:18
ListObservableCollectionи подпишитесь на ее событиеCollectionChanged– Андрей NOP Mar 06 '18 at 08:46