-==请教如何实现一个计算方法==-

tianxia08 2017-02-03 03:20:06
相当于点菜操作,一个菜一个菜的添加,然后后台计算这个菜的能量值(还有其它值,这个计算时间略长)
现在想实现:添加第一个菜的时候开始计算,计算完返回,如果还在计算的时候添加第二个菜,则计算这两个菜的能量值的和
简单的说就是:加一个菜就算一次,加第二时如果没算完就重新计算
请问用什么技术,队列?
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxia08 2017-02-03
  • 打赏
  • 举报
回复
多谢
  • 打赏
  • 举报
回复
我给你写一个控制台的例子:
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 标志就够了。
  • 打赏
  • 举报
回复
你可以先把前边的 90% 以上的代码写出来,你的问题放到最后,等你计算热量无误、只是并发地刷新显示计算结果时有时显示不是最后一次计算时,再说!
  • 打赏
  • 举报
回复
基本上你的问题并不是实践问题,而是你“感觉应该弄点高大上的名词儿”的问题。你可能遇到多线程、异步的概念,就想到要人家 java 的书上(或者一些中了10年前 java 书籍的毒的一些博客作者)不断地跟你说“队列、生产者-消费者”这种词儿。 其实就算是 java 的新版本也早就学 c# 而变得优雅多了。你在 c# 中可以有7、8 种直截了当的方式进行异步编程,最近3、4 年的写法是 async/await,这些异步程序写法都是“1、2句话”就搞定了,不用自己去编写什么队列算法之类的一大堆模式的东西,只要你能有悟性迅速理解 .net/c# 异步编程即可。
Poopaye 2017-02-03
  • 打赏
  • 举报
回复
楼主是否能先画张流程图出来?
  • 打赏
  • 举报
回复
用不到什么技术,推导明白流程即可。 既然你可以并发操作,“在第一个计算没有完成之前就点第二个菜”(我假设你确实是这样并行设计的,比一般人的程序麻烦),那么当你点第二个菜之后也就开始了第二次计算。那么当第二次计算技术结束了,要显示刷新,它自然就覆盖了第一次计算的结果。对于代码来说,基本上可以保证说第2次的
Control.BeginInvoke(刷新界面显示能量值);
操作一定是在第一次之后。 所以你先这样开发出来,什么也不用做。先做出来再说,等将来确实有 bug 再说。 等你把长征路的90%都走完了,你害怕最后那一哆嗦吗?最后在纠结界面刷新时是不是最新数据的问题,例如可以在计算完毕时写一个时间变量,而 UI 线程最终要显示数据时可以比较一下当前数据的时间是不是最后计算完毕的时间。但是这留到以后,有必要的时候,再花10分钟去解决。你先解决前边 90% 的问题,将来可能会发现这个根本没有必要去做。
wanghui0380 2017-02-03
  • 打赏
  • 举报
回复
给关键字,你自己百度看看 ObservableCollection<T>看这个东西怎么用,有没有一个叫OnCollectionChanged 的方法

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧