0

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

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

谢谢!

4

2 回答 2

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
        }
    }
}
于 2012-09-07T09:19:16.630 回答
1

你并不真的需要 BackgroundWorker,因为 WebClient 类有 Async 方法。

因此,您可能只需为每个“服务”拥有一个 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);
}
于 2012-09-07T09:06:51.010 回答