试图全局访问变量

时间:2011-07-15 18:11:06

标签: c# timer double

我有一个迷宫游戏,我试图一次创建两个计时器。 1号(300秒后退出游戏)

t1.Interval = 30000;
t1.Enabled = true;
t1.Elapsed += new ElapsedEventHandler(hiddenTimer);

public static void hiddenTimer(object source, ElapsedEventArgs e)
    {
        Console.Clear();
        Environment.Exit(1);
    }

2nd(显示每1秒剩余的时间(如真实计时器))

t2.Interval = 1000;
t2.Enabled = true;
t2.Elapsed += new ElapsedEventHandler(showTimer);

public static void showTimer(object source, ElapsedEventArgs e)
    {
        Console.Write(timeLeft);
    }

我想在全局范围内传递声明timeLeft,但它说“非静态字段,方法或属性需要一个对象引用......”

我如何正确宣布?

4 个答案:

答案 0 :(得分:7)

通过制作静态属性:

public static Double TimeLeft { get; set; }

如果您希望Publicliy可以从您的整个上下文访问,如果您想将其设为私有,只需将public更改为private

只是旁注,内置Timer不支持轮询剩下的时间,直到下一次过去。您可以在1秒定时器的每个TimeLeft - 事件中减少Elapse,也可以查看this

修改

这是使用一个计时器的一种方法,首先我声明了两个属性和一个我使用的常量字段,不要打扰它们是静态的,这样就更容易以控制台应用程序的形式运行它。 / p>

public static Timer SystemTimer { get; set; }
public static double Elapsed { get; set; }

private const double CycleInterval = 1000;

然后在我的Main - 方法中,我有以下内容来启动我的Timer

SystemTimer = new Timer();
SystemTimer.Interval = CycleInterval;
SystemTimer.Enabled = true;
SystemTimer.Elapsed += Cycle;

SystemTimer.Start();

有了这个,Cycle - 事件处理程序可能如下所示:

static void Cycle(object sender, ElapsedEventArgs e)
{
    Elapsed += CycleInterval;

    if ((Elapsed%5000) == 0.0)
    {
        Console.WriteLine("5 sec elapsed!");
        // Do stuff each 5 sec
    }

    if ((Elapsed % 10000) == 0.0)
    {
        Console.WriteLine("10 sec elapsed!");
        // Do stuff each 10 sec
    }

    Console.WriteLine("Elapsed: {0}", Elapsed);
}

您也可以将Elapsed作为TimeSpan,但您可以根据需要对其进行重构。

这是我使用的完整源代码:

using System;
using System.IO;
using System.Timers;

namespace ConsoleApplication5
{
    class Program
    {
        public static Timer SystemTimer { get; set; }
        public static double Elapsed { get; set; }

        private const double CycleInterval = 1000;

        static void Main(string[] args)
        {
            SystemTimer = new Timer();
            SystemTimer.Interval = CycleInterval;
            SystemTimer.Enabled = true;
            SystemTimer.Elapsed += Cycle;

            SystemTimer.Start();

            while (true) ;

        }

        static void Cycle(object sender, ElapsedEventArgs e)
        {
            Elapsed += CycleInterval;

            if ((Elapsed%5000) == 0.0)
            {
                Console.WriteLine("5 sec elapsed!");
                // Do stuff each 5 sec
            }

            if ((Elapsed % 10000) == 0.0)
            {
                Console.WriteLine("10 sec elapsed!");
                // Do stuff each 10 sec
            }

            Console.WriteLine("Elapsed: {0}", Elapsed);
        }
    }
}

这就是我跑步时的样子:

enter image description here

答案 1 :(得分:2)

首先,如果你希望它的行为像全局变量,你应该将你的timeLeft声明为静态。

其次我会使用一个计时器并分别跟踪每个事件的时间:

static DateTime startTime = DateTime.Now;
static DateTime lastTime = DateTime.Now;

在你的计时器中,应设置为能够提供更高精度的计时器,如1/10秒,请执行以下操作:

if (DateTime.Now - lastTime > new TimeSpan(0, 0, 1))
   // Update the time here for your 1s clock
lastTime = DateTime.Now;

if (DateTime.Now - startTime > new TimeSpan(0, 0, 300))
    // Exit the game

这样的时间会更准确。

答案 2 :(得分:0)

将其标记为静态:

public static int TimeLeft;

答案 3 :(得分:0)

您的timeLeft会员不是静态

使其静态或使showTimer方法静态。

问候。