私の質問に似ているので、私の問題は解決していません。私は数秒ごとにRedisデータベースをポーリングし、結果に基づいてアクションを実行するWindowsサービスを作成しています。私は別のコマンドが別のスレッドで処理されている間にRedisから結果を取得した場合、複数のアクションを同時に実行できるように、ソートの「スレッドプール」を作成したいと思います。Windowsサービスのスレッドを使用して無限にループする
私の主な問題の1つは、私のWindowsサービスを停止すると、プロセスが閉じずに30秒程度の間そのままになってしまうことです。ここでは、関連するコードスニペットは、次のとおりです。
Thread Worker;
IDatabase db = ...;
AutoResetEvent StopRequest = new AutoResetEvent(false);
protected override void OnStart(string[] args) {
var poller = new Poller();
Worker = new Thread(() => poller.Poll(StopRequest));
Worker.Start();
}
protected override void OnStop() {
// Signal worker to stop and wait until it does
StopRequest.Set();
Worker.Join();
}
はここPoller
クラスPoll
方法の一例です。
public async void Poll(AutoResetEvent finished)
{
var res = string.Empty;
while (!finished.WaitOne(1000))
{
res = db.StringGet($"task");
if (!String.IsNullOrEmpty(res))
{
ParseAction(res);
}
db.KeyDelete($"task");
}
}
ので(うちトリミング多い)このコードは正常にバックグラウンドで実行されているままで、うまくRedisのから入ってくるクエリを処理するようだが、私は、私として正しく閉じていないプロセスで問題を抱えています上記の通り。私はこれがこのような状況のために取る最良のアプローチであるかどうかも分かりません。私はこのスレッドの問題を処理するためのより良い、またはより "慣用的な"方法についてのいくつかの指針が好きです。
ありがとうございます!