C# 控制台应用程序C中的计时器类# 公共类PacketPoller { 私人定时器; 公开作废开始() { m_timer=新定时器(点击(空),空,0,1); m_timer.InitializeLifetimeService(); } 公共操作OnTick(){} }

C# 控制台应用程序C中的计时器类# 公共类PacketPoller { 私人定时器; 公开作废开始() { m_timer=新定时器(点击(空),空,0,1); m_timer.InitializeLifetimeService(); } 公共操作OnTick(){} },c#,timer,C#,Timer,这是我的代码,但是,计时器似乎需要一个静态方法,而不是一个面向对象的方法。我能怎么办?我希望用户能够创建一个新的计时器,然后更改它的OnTick以设置要调用的方法。我该怎么做呢?这是我最近成功使用的 public class PacketPoller { private Timer m_timer; public void Start() { m_timer = new Timer(OnTick(null), null, 0, 1); m

这是我的代码,但是,计时器似乎需要一个
静态
方法,而不是一个面向对象的方法。我能怎么办?我希望用户能够创建一个新的计时器,然后更改它的OnTick以设置要调用的方法。我该怎么做呢?

这是我最近成功使用的

public class PacketPoller
{
    private Timer m_timer;

    public void Start()
    {
        m_timer = new Timer(OnTick(null), null, 0, 1);
        m_timer.InitializeLifetimeService();
    }

    public Action<Object> OnTick() { }
}

我猜您正在使用
System.Timers.Timer
类。
我建议改用
System.Windows.Forms.Timer
类。它不需要静态回调函数,使用起来更容易(因为它没有线程化,所以更容易调试)。
这将需要对
System.Windows.Forms
assembly-tho的引用

        DispatcherTimer timer1stDoze = new System.Windows.Threading.DispatcherTimer();
        timer1stDoze.Tick += new EventHandler(timer1stDoze_Tick);
        timer1stDoze.Interval = new TimeSpan(0, 5, 0);
        timer1stDoze.Start();

如果您要坚持使用
系统.Threading.Timer
,请按原样使用,但要让您的
PacketPoller
有自己的事件,您将结合使用:

timer.Tick += new EventHandler(CallbackFunction);

监听器将连接到您的
PacketPoller。勾选
事件,而不是直接勾选
m_计时器。我假设你没有一个状态可以通过,但如果你需要,你可以通过它。(注意我修改了
OnTick
的方法签名,还修改了构造函数调用)

在任意方法出现滴答声时使用连接。编辑:没关系,我想我链接到了一个与您使用的类不同的
计时器类。是否有编译错误?尝试替换此项:
m_timer=new timer(单击(null),null,0,1)使用此选项:
m_timer=new timer(OnTick,null,0,1)您使用的计时器是什么?存在System.Windows.Forms.Timer。System.Threading.Timer和System.Timers.Timer。。。如果您使用的是Systme.Windows.Forms.Timer,这在控制台应用程序中不起作用。@PeterRitchie在控制台应用程序中应该可以正常工作,只要您引用
Windows.Forms
程序集。@Jite,除非您创建一个消息泵(即打开一个表单)
public class PacketPoller
{
    public event EventHandler Tick;

    private Timer m_timer;

    public void Start()
    {
        m_timer = new Timer(OnTick, null, 0, 1);
        m_timer.InitializeLifetimeService();
    }

    public void OnTick(object state) 
    { 
        var tick = this.Tick;
        if (tick != null)
            tick();
    }
}