時間のかかるタスクを実行するために、Backgroudworkerを使用していくつかの作業を行いました。
public void ConnectDataProvider()
{
bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
}
別の方法でバックグラウンドワーカーを開始します。
public void StartPolling()
{
bgw.RunWorkerAsync();
}
次に、イベント処理を行いました。
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// do it over again
StartPolling();
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
// do work
WriteData();
}
ご覧のとおり、完了時にワーカーを最初からやり直しました。これで、これは1人のバックグラウンドワーカーで機能します。
今、私はコレクションが欲しいです、そして各アイテムはこのタスクを実行するべきです。ただし、上記の概念では、ワーカーを最初からやり直すため、最初に開始したワーカーで実行を継続します。私は、タイマーを組み合わせることで状況を解決し、他のワーカースレッドに道を譲ることができるのではないかと考えています。
BackgroundWorkerはまだ良い選択ですか?私のようにBackgroundWorkerを再利用するのは一般的ですか?
編集1:明確にするために:私が直面している問題は、それぞれ独自のBackgroundWorkerを使用してコレクションを管理する必要があるということです。各アイテムから定期的にリクエストを出すタイマーを考えていました。これは私が立ち往生しているところです。
編集2:私自身の答えを見てください、私はこの問題を解決しませんでしたが、私が欲しいものを手に入れるためにタイマーと一緒に行くことができることがわかりました。
編集3:私が達成したかったことを明確にするために(別の試み、私はそれが得意ではありません):GPS追跡用の追跡オブジェクトがあります。私はそれらの全体を追跡したいので、追跡デバイスごとに1つのオブジェクト。それらはすべて頻繁にポーリングする必要があります。単一のテストオブジェクト用にBackgroundWorkerを設定しました。私は、Backgroundworkerが完了したときに教えてくれる方法が好きでした。しかし、すべての追跡オブジェクトで機能させることはできませんでした。
現在、すべての追跡オブジェクトには独自のタイマーがあります。このタイマーは新しいスレッドを生成し、時間のかかる作業を実行します(私はDoWriteと名付けました)。タイマーを破棄してから新しいタイマーを作成するため、BackgroundWorkerは必要ありません。それがすべてです。