1

在 WinForms (C#) 应用程序中,我在运行时创建了几个自定义控件。这些自定义控件称为 JobTimers 并继承/扩展标准控件 Timer。

public class JobTimer : System.Windows.Forms.Timer
{
    private int IntJobID;
    public int JobID
    {
        get{return IntJobID;}
        set{IntJobID = value;}
    }
}

public static void CreateTimer(int JobID) 
{
    JobTimer ControlJobTimer = new JobTimer();
    ControlJobTimer.Enabled = true;
    ControlJobTimer.JobID = JobID;
    ControlJobTimer.Interval = 30000;
    ControlJobTimer.Tick += new EventHandler(JobTimer_Tick);
    ControlJobTimer.Start(); 
}

类似于我们如何查询表单上的标准或自定义控件的集合 - 我们可以访问/查询这些自定义 JobTimer 控件的集合吗?

注意:出现这个问题的原因是我没有看到这些控件停靠/放置在任何表单中,因此仅存在于程序的内存中。同样在停止/退出应用程序时,这些控件也消失了。

换句话说,如何获得应用程序中所有计时器的列表以及访问它们的属性?

4

3 回答 3

0
    public static List<JobTimer> _timers;

    public class JobTimer : System.Windows.Forms.Timer
    {
        private int IntJobID;
        public int JobID
        {
            get { return IntJobID; }
            set { IntJobID = value; }
        }
    }

    public static void CreateTimer(int JobID)
    {
        if (_timers == null)
        {
            _timers = new List<JobTimer>();
        }
        JobTimer ControlJobTimer = new JobTimer();
        ControlJobTimer.Enabled = true;
        ControlJobTimer.JobID = JobID;
        ControlJobTimer.Interval = 30000;
        ControlJobTimer.Tick += new EventHandler(JobTimer_Tick);
        ControlJobTimer.Start();
        _timers.Add(ControlJobTimer);
    }

然后您可以访问全局列表_timer,所有创建的jobtimer实例都将添加到那里

于 2014-09-11T10:43:58.023 回答
0

这段代码有味道。从 Timers 派生的自定义控件是实现您想要的非常昂贵的方法。您可以使用线程、后台工作人员、订阅/发布模型,而不是更优化。

我们可以访问/查询这些自定义 JobTimer 控件的集合吗?

很简单,当您声明 JobTimers 时,可以在父表单中保持对它们的访问,例如:

List<JobTimer> jobTimers = new List<JobTimer>();
于 2014-09-11T10:44:16.200 回答
0

正如其他人已经说过的,您必须自己保存并保持安全创建的计时器。没有AllTimers集合,因此您必须创建和管理一个。

子类化Timer是个坏主意。这可能是更合适且易于扩展的版本:

using System.Windows.Forms;

public class JobTimer
{
    public Timer Timer {get; set;}
    public string ID {get; set;}
}

public List<JobTimer> _timers = new List<JobTimer>();

public static void CreateTimer(int id) 
{
    var timer = new Timer() { Interval = 30000 };
    var job = new JobTimer() { Timer = timer, ID = id };
    _timers.Add(job);
    timer.Tick += JobTimer_Tick;
    timer.Start(); 
}

public static void DisposeTimers()
{
    foreach(var timer in _timers)
        timer.Dispose();
}
于 2014-09-11T12:18:23.887 回答