0

私は、Twitter、Facebook、Weather、Financeなどのさまざまなサービスからのデータをポーリングするいくつかのいわゆる「サービス」があるWindowsフォームアプリに取り組んでいます。これで、各サービスに個別のポーリング間隔が設定されたのでSystem.Windows.Forms.Timer、各サービスにを実装し、それに応じてプロパティを設定しIntervalて、各タイマーが事前設定された間隔でイベントを発生させ、サービスが新しいデータをプルするようにしようと考えていました。できれば、を介して非同期にしBackgroundWorkerます。

これはそれを行うための最良の方法ですか?または、アプリの速度が低下してパフォーマンスの問題が発生しますか。それを行うためのより良い方法はありますか?

ありがとう!

4

2 に答える 2

4

1つでそれを行うことができますが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

WebClient クラスには Async メソッドがあるため、BackgroundWorker は実際には必要ありません。

そのため、「サービス」ごとに 1 つの 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 に答える