これは長い2パートの質問ですので、私と一緒にお手伝いしてくれてありがとうございました。 Windowsサービスでのマルチスレッド/データベースポーリング
- 投票データベーステーブル:いくつかの責任を持って
私はWindowsサービスを作成しています(.NET 4) (ファイルパス、処理ステータス)
- データベースへのレコード処理結果
- イベント処理時に通知する(処理完了、処理エラー)
各アイテムの処理時間は時間がかかると考えられますので、処理は自分のスレッドで実行する必要があり、複数のアイテムは同時に処理する必要がありますキューに多数のアイテムがある場合は、キュー内のすべてのアイテムではありません)。
私はマルチスレッドの専門家ではありませんが、このプロジェクトではデータベースのポーリングとファイル処理に必要と思われます。
私はTask Parallel Libraryを使うべきだと思っていますが、このアプリケーションのコーディングをどこから始めるべきか分かりません。
データベースをポーリングするにはどうすればよいですか?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.Threading.Tasks;
public class DbPoller
{
Timer _timer;
public double Interval { get; private set; }
public DbPoller(double interval)
{
Interval = interval;
}
public void BeginPolling()
{
if (_timer != null)
{
_timer.Dispose();
}
_timer = new Timer(Interval);
_timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
_timer.Start();
}
public void EndPolling()
{
if (_timer != null)
{
_timer.Dispose();
}
}
public IEnumerable<BatchMetadata> Poll()
{
var pollTask = new Task<IEnumerable<BatchMetadata>>(() =>
{
// polling logic here
throw new NotImplementedException();
});
pollTask.Start();
return pollTask.Result;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Poll();
}
}
がどのように私は複数の項目の処理を管理する必要があります
は、ここで私が持っていたデータベース・ポーリングクラスのでしょうか?
これは私がさらに不確かな領域です。上で述べたように、ファイル処理は独自のスレッド上で行われるべきだと私は思っています。また、私はいくつかのアイテムを同時に処理する必要があると思います(非常に多くのものがあれば、キューのすべてではありませんが)。 TPLにスレッドセーフなキュークラスがあることがわかっています。私は、同時に処理されるアイテムの数を管理するのが自分の責任であると考えていますか、それともTPLにも同様に役立つ機能がありますか?