110,536
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace ConsoleApplication1
{
public class Program
{
static Random rnd = new Random();
static void Main(string[] args)
{
var container = new List<int>();
var 最后显示的数据 = -1;
for (var i = 0; i < 20; ++i)
{
lock (container)
container.Add(rnd.Next(100, 200)); //模拟放入一个热量为100~200的食物
var j = i;
ThreadPool.QueueUserWorkItem(h => //放入食物之后,异步进行 sum 计算和打印
{
var sum = 求和(container, j + 1);
lock (container)
{
if (j > 最后显示的数据)
{
最后显示的数据 = j;
Console.WriteLine("第{0}次计算,合计: {1}", j + 1, sum);
}
}
});
}
Console.WriteLine("....................按任意键结束");
Console.ReadKey();
}
static int 求和(List<int> container, int 计算前几个食物)
{
Thread.Sleep(10 * rnd.Next(container.Count)); //模拟一个查表计算延时操作
lock (container)
return container.Take(计算前几个食物).Sum();
}
}
}
这里,顺序(for循环)创建20个“菜”,然后异步模拟计算热量的操作,并且假设所花的时间长度是随机的。你可以看到,只要记录“最后显示序号”,用它来校验不要将更早期的数据显示,就够了。有这样一个 int 标志就够了。Control.BeginInvoke(刷新界面显示能量值);
操作一定是在第一次之后。
所以你先这样开发出来,什么也不用做。先做出来再说,等将来确实有 bug 再说。
等你把长征路的90%都走完了,你害怕最后那一哆嗦吗?最后在纠结界面刷新时是不是最新数据的问题,例如可以在计算完毕时写一个时间变量,而 UI 线程最终要显示数据时可以比较一下当前数据的时间是不是最后计算完毕的时间。但是这留到以后,有必要的时候,再花10分钟去解决。你先解决前边 90% 的问题,将来可能会发现这个根本没有必要去做。