Asked:2020-03-06 16:43:06 +0000 UTC2020-03-06 16:43:06 +0000 UTC2020-03-06 16:43:06 +0000 UTC
执行任务的最佳方法是什么?
772
有一个功能。在那里我抛出一个列表List<double>,遍历每个元素并使用一些函数计算一个新数组。因此,每分钟都有一个新元素出现在我的列表中,我需要在新数组中获取一个新元素。原来我每次都会计算整个数组得到最终结果,因为 其中先前的计算会影响下一个值。有什么方法可以计算,等到我得到一个新元素,然后用新元素继续 for 循环?
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);
}
}
您的任务类似于生产者/消费者模式。一段代码产生数据,另一段代码消耗它。
在现代 C# 中使用管道(pipelines)非常方便。
在您的情况下可能看起来如何的简化示例:
在这个控制台应用程序中,一个线程将数据放入
BlockingCollection,另一个线程在数据进入时读取并进行处理。通过调用该方法,GetConsumingEnumerable第二个线程将无限期地等待新数据的到达。直到第一个线程调用CompleteAdding.