初学者试图在for循环中实现一个计时器c#

时间:2018-04-11 17:08:34

标签: c# for-loop timer

我对c#和编码很新,并且在for循环中实现定时器时遇到一些问题。基本上,下面的代码位试图以设定的间隔创建一个代表岛屿垃圾输出的数字,每个输出基于岛屿种群加权的可预测性稍差。然后它将生成的垃圾数量添加到总数中。我遇到的问题是教程使用Timer类的方式意味着在'Intervaltimer_Elapsed(object sender, ElapsedEventArgs e)'之外创建Main()函数,我无法弄清楚如何将此生成的任何内容添加回到weights[]中的Main()数组。我真正想做的就是编译器进入for循环,告诉它等待'x'滴答,然后继续。 Thread.Sleep不是一个选项,因为这是统一的,所以会打断其他事情。如果下面的代码有点血腥,请道歉!

{
class Program
{
    public static double trashperstan8 = 600 * 3.21;
    public static int population = 1000;
    public static double trashperpersperday = 1;
    public static double interval = 60;
    public static double intperday = 1440 / interval;
    public static double trashperint = population * trashperpersperday * (interval / 1440);
    public static int weightnum = population / 200;

    static void Main(string[] args)
    {
        double Trashlevel = new double();
        double stand8sfilled = new double();
        Timer intervaltimer = new Timer((interval / 30) * 1000);
        Console.WriteLine(weightnum);

        for (int inti = 0; inti < intperday; inti++)
        {
            /* at this point, I want to basically tell the code: each time you go 
               through the for loop, wait for x number of ticks then do the method */

            Console.WriteLine(inti);

            double[] weights = new double[weightnum];

            Random rand = new Random();

            for (int i = 0; i < weightnum; i++)
            {
                double weightcontrib = rand.NextDouble();

                weights[i] = weightcontrib;
                Console.WriteLine("{0}: {1}", Array.IndexOf(weights, weightcontrib), weightcontrib);
            }

            double finalweight = 2 * (weights.Sum() / weightnum);
            Console.WriteLine("final weight " + finalweight);

            double weightedtpi = trashperint * finalweight;

            Trashlevel = Trashlevel + weightedtpi;

            stand8sfilled = stand8sfilled + (weightedtpi / trashperstan8);
        }
        Console.WriteLine("trash level " + Trashlevel);
        Console.WriteLine("stand8s filled " + stand8sfilled);
    }

    private static void Intervaltimer_Elapsed(object sender, ElapsedEventArgs e)
    {
    }
}

}

1 个答案:

答案 0 :(得分:4)

  

我真正想做的就是编译器进入for循环,告诉它等待'x'滴答,然后继续。 Thread.Sleep不是一个选项,因为这是统一的,所以会打断其他事情。

解决方案1:根本不要编写循环。 计时器已经逻辑上是一个循环

  • 编写一个方法,即“循环”的“主体”。
  • “启动循环”正在激活一个计时器,其中body方法是事件处理程序,计时器每隔n毫秒触发一次
  • “终止循环”正在停用计时器。

解决方案2:编写循环,不要使用计时器。

将方法async然后await Task.Delay(whatever);设置为异步等待延迟。您的方法将在等待等待时暂停,并在延迟任务完成后的某个时刻恢复。

后者可能是更好的解决方案,因为代码更类似于您对它的描述。

我对Unity的了解不足以说明哪个是他们框架中更好的解决方案。