计时器正在滴答作响时,不定期地做一些事情

时间:2014-12-21 21:07:53

标签: c# asp.net timer network-programming simulation

我正在尝试使用单线程时间驱动模拟来模拟Aloha。任何时候任何节点都可以生成一个帧。我有五个节点(A到E)和一个每1秒钟滴答一次的计时器。我希望在任何时候,例如节点创建一个帧后经过15秒,然后一段时间后另一个节点创建一个帧(以不规则的间隔)。

E.g. (Output)

Time 
1       Node A created a frame.
2
3       Node B created a frame.
4
5
6
7
8       Node E created a frame.
9
10

在我现在的代码中,任何帧都是由节点每秒创建的。节点是随机选择的。

E.g. (Current output)
1     Node E created a frame. 
2     Node B created a frame.
3     Node E created a frame.
4     Node A created a frame.
5     Node E created a frame.

a。)我不希望节点每秒生成一个帧,但在模拟过程中会以不规则的间隔生成帧。

b。)然后我必须创建一个不允许节点的方法,例如A生成另一帧直到一段时间让我们说10秒过去了。如果在那10秒期间没有其他节点创建了帧,则在计数器处成功发送帧递增。如果在那10秒内另一个节点创建了一个帧,则两个帧(例如,由A创建的帧和由该节点创建的帧不成功)。

private static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            time++;
            Random r = new Random();
            //int rnd = r.Next(0, 50);


            if (time > 50)
            {
                Console.WriteLine("Simulation Finished.");
                timer.Stop();

            }
            else
            {
                Console.WriteLine(time + " " + Node());
            }  


        }

        //Randomly select a node
        private static string Node(){
            string[] nodeList = { "A", "B", "C", "D", "E" };
            Random r = new Random();
            int index = r.Next(0, nodeList.Length);
            return Convert.ToString(nodeList[index]);
        }

感谢您的帮助,我们将非常感谢您提供的代码段。

1 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但是你无法在timer_Elapsed事件中重置计时器的间隔?

timer.Interval = random.Next(1,15)* 1000;

使用System.Timers;

public class Simulation {
    private Timer intervalTimer;
    private Timer actionTimer;
    private Random random = new Random();
    private bool writeState = false;
    private int currentTick = 0;

    public Simulation(){
        intervalTimer = new Timer(SetRandomInterval());
        actionTimer = new Timer(1000);

        intervalTimer.Elapsed += new ElapsedEventHandler(IntervalTimerElapsed);
        actionTimer.Elapsed += new ElapsedEventHandler(ActionTimerElapsed);

        intervalTimer.Start();
        actionTimer.Start();
    }

    protected void IntervalTimerElapsed(object sender, EventArgs e) {
        if (writeState){
            writeState = false;
        } else {
            writeState = true;
        }

        intervalTimer.Interval = SetRandomInterval();
    }

    protected void ActionTimerElapsed(object sender, EventArgs e) {
        if (writeState){
            Console.WriteLine(currentTick.ToString() + " " + Node());
            writeState = false;
        } else {
            Console.WriteLine(currentTick.ToString());
        }

        currentTick++;
    }  

    private string Node(){
        string[] nodes = { "A", "B", "C", "D", "E" };
        int index = random.Next(0, nodes.Length);
        return Convert.ToString(nodes[index]);
    }

    private int SetRandomInterval(){
        return (random.Next(1, 15) * 1000);
    }
}

打印出来:

0 D
1
2 A
3
4
5
6 D
7
8
9 B
10 E
11
12 B
13
14
15 B
16
17
18 C
19
20
21
22 A
23
24
25 B
26 C
27 C
28 E
29 B
30
31
32
33 D

你也可以使用一个单一的Random()实例,否则你可以在这样一个" rapid"中连续获得相同的值。像Elapsed这样的事件。 使用新的Random in Elapsed可能会有点贵。