使用动态实例名称创建多个计时器

时间:2012-02-05 16:40:35

标签: c# timer

我正在编写一项服务,需要创建多个计时器(系统)。直到运行时才知道要创建的定时器的数量,它基于外部(XML)配置文件上的内容。 每个计时器将分配不同的任务和不同的间隔。

如何动态创建x个定时器?我想在类实例名称中使用for循环中的计数,但我似乎无法弄清楚如何执行此操作。

如下所示的当前代码,它创建一个带有for循环最后结果的计时器。我想为每个循环创建一个计时器。

我正在学习C#,所以示例会非常有用。

var items = GetDownloadList();
int CountDownloadListItems = DownloadItemsCount();

for (int i = 0; i < CountDownloadListItems; i++)
{
    if (ClassLib.UrlExists.Check(items[i, 2], items[i, 0]))
    {
        //new instance of timers

        Timers downloadTimer = new Timers();
        downloadTimer.CreateTimer(items[i, 2], items[i, 3], items[i, 4], items[i, 0], items[i, 5], items[i, 6]);

    }
}

// My Timers Class

public class Timers
{

    //timer
    private Timer _timer = new Timer();
    private volatile bool _requestStop = false;

    public Timers()
    {
        _timer.Interval = 20;
        _timer.Elapsed += Timed;
        _timer.AutoReset = false;

    }

    private string _Url;
    private string _Save;
    private string _File;
    private string _Id;
    private string _FreqValue;
    private string _FreqUnit;

    public string Url
    {
        get { return _Url; }
        set { _Url = value; }
    }

    public string Save
    {
        get { return _Save; }
        set { _Save = value; }
    }

    public string File
    {
        get { return _File; }
        set { _File = value; }
    }

    public string Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    public string FreqValue
    {
        get { return _FreqValue; }
        set { _FreqValue = value; }
    }

    public string FreqUnit
    {
        get { return _FreqUnit; }
        set { _FreqUnit = value; }
    }

    public void CreateTimer(string url, string save,string file,string id,string freqValue,string freqUnit)
    {
        this.Url = url;
        this.Save = save;
        this.File = file;
        this.Id = id;
        this.FreqValue = FreqValue;
        this.FreqUnit = FreqUnit;

        _timer.Interval = 2000;
        _timer.Start();
    }

    private void Timed(object source, ElapsedEventArgs e)
    {
        _timer.Stop();

        //StreamWriter sr = new StreamWriter("E:\\downloader\\"+Id+".txt");
        //sr.Write(Url+" "+Save+" "+File+"\n\n");
        //sr.Close();

        ClassLib.Update.File(Url,Save,File,Id);

        _timer.Start();
    }
}

1 个答案:

答案 0 :(得分:0)

您似乎是为for循环中的每个值创建一个新的Timers。但是,您似乎没有保留对它们的引用。

如何添加存储引用的Dictionary<string, Timers>变量并使用“名称”?

 var timersDict = new Dictionary<string, Timers>();
 var items = GetDownloadList();
 int CountDownloadListItems = DownloadItemsCount();


for (int i = 0; i < CountDownloadListItems; i++)
                {
                    if (ClassLib.UrlExists.Check(items[i, 2], items[i, 0]))
                    {
                        //new instance of timers

                        Timers downloadTimer = new Timers();
                        downloadTimer.CreateTimer(items[i, 2], items[i, 3], items[i, 4], items[i, 0], items[i, 5], items[i, 6]);
                        timersDict.Add("Timer" + i, downloadTimer);

                    }

                }