初学者计时器螺纹程序来回答一个谜语

时间:2015-05-28 08:11:02

标签: c# multithreading timer task

所以我试图通过写一个解决问题的程序来回答我的朋友在求职面试中遇到的问题:"在第二个时间点,一只蚊子开始每秒产生另一只蚊子商标及其后。从t = 0s的一只蚊子开始,8.5秒后我们会有多少只蚊子?"

public class ok
    {
        public static int num;

        public static void mosquito()
        {
            Task.Delay(1000);
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += OnTimedEvent;
            aTimer.Interval = 1000;
            aTimer.Enabled = true;
        }

        // Specify what you want to happen when the Elapsed event is raised.
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            num++;
            ThreadStart mos = mosquito;

        }
    }

public static void Main()
        {
            ok.mosquito();
            SendWithDelay();

            Console.WriteLine("Press a key to exit");
            Console.ReadKey();
        }

        // Prints mosquito count after 8.5 seconds
        private static async Task SendWithDelay()
        {
            await Task.Delay(8500);
            Console.WriteLine(ok.num);
        }

这是我试图编写的简单代码,但显然失败了。我尝试阅读任务API并以更好的方式了解正在进行的操作,并且我知道我需要确保访问变量" num",它会跟踪蚊子数是线程安全的,但我对此非常生疏。

非常感谢帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

把问题解决了,所有两秒钟的蚊子都会产生另一只蚊子,所以我们需要一点历史,让我们使用一个阵列:

int[9] mosquitoHistory;

从计时器开始会使事情变得复杂,假设事情每秒发生一次,让我们使用一个循环。

for (i = 0, i++, i < 9)
{

如果我们能从2s前获得蚊子的数量

int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);

写下这一秒的蚊子数量,即我们有多少蚊子加上成熟的蚊子产生的数量。

mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;

输出结果

Console.WriteLine(mosquitoHistory[seconds]); 

最后,如果你想让它模拟只是睡一秒钟:

Threading.Thread.Sleep(1000);

把它们放在一起,这就是你得到的。

using System;
public class Program
{
    public static void Main()
    {
        int[] mosquitoHistory = new int[9];
        for (int seconds = 0; seconds < 9; seconds++)
        {
            int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);
            mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;                 
            Console.WriteLine(mosquitoHistory[seconds]); 
            Threading.Thread.Sleep(1000);
        }
    }
}

我得了34只蚊子。

答案 1 :(得分:-1)

它是一种简单的离散2^n算法。

2s mark we have 1 + 1 = 2
3s mark we have 1 + 1 + 2 = 4
4s mark we have 1 + 1 + 2 + 4 = 8
5s mark we have 1 + 1 + 2 + 4 + 8 = 16

代码示例

var numMosqito = 1;
for (float time = 0; time  <= 8.5; time ++)
{
     if (time  >= 2)
         numMosqito += numMosqito;


     Console.WriteLine("{0}, {1}", time, numMosqito);
}

Console.ReadLine();