在C#中实现多个计时器

时间:2012-09-07 08:44:14

标签: c# winforms timer backgroundworker

我正在开发一个Windows窗体应用程序,我有几个所谓的“服务”,可以从Twitter,Facebook,天气,财务等各种服务中查询数据。现在我的每个服务都有自己的轮询间隔设置,所以我想我可以为每个服务实现System.Windows.Forms.Timer并相应地设置其Interval属性,这样每个计时器都会在预设中触发事件将导致服务提取新数据的时间间隔,最好是BackgroundWorker

这是最好的方法吗?或者它会减慢我的应用程序导致性能问题。有没有更好的方法呢?

谢谢!

2 个答案:

答案 0 :(得分:4)

你可以用一个Timer来做,只需要更智能的间隔方法:

public partial class Form1 : Form
{
    int facebookInterval = 5; //5 sec
    int twitterInterval = 7; //7 sec

    public Form1()
    {
        InitializeComponent();

        Timer t = new Timer();
        t.Interval = 1000; //1 sec
        t.Tick += new EventHandler(t_Tick);
        t.Start();
    }

    void t_Tick(object sender, EventArgs e)
    {
        facebookInterval--;
        twitterInterval--;

        if (facebookInterval == 0)
        {
            MessageBox.Show("Getting FB data");
            facebookInterval = 5; //reset to base value
        }

        if (twitterInterval == 0)
        {
            MessageBox.Show("Getting Twitter data");
            twitterInterval = 7; //reset to base value
        }
    }
}

答案 1 :(得分:1)

您并不真正需要BackgroundWorker,因为WebClient类具有异步方法。

所以你可能只为你的每个“服务”都有一个WebClient对象,并使用这样的代码:

facebookClient = new WebClient();
facebookClient.DownloadStringCompleted += FacebookDownloadComplete;
twitterClient = new WebClient();
twitterClient.DownloadStringCompleted += TwitterDownloadComplete;

private void FacebookDownloadComplete(Object sender, DownloadStringCompletedEventArgs e)
{
    if (!e.Cancelled && e.Error == null)
    {
        string str = (string)e.Result;
        DisplayFacebookContent(str);
    }
}
private void OnFacebookTimer(object sender, ElapsedEventArgs e)
{
     if( facebookClient.IsBusy) 
         facebookClient.CancelAsync(); // long time should have passed, better cancel
     facebookClient.DownloadStringAsync(facebookUri);
}