私は実行中のスレッドを1秒から数か月までの間にブロックする必要があるプロジェクトに取り組んでいます。Int32.MaxValueよりも長いスレッドをブロックする
私が考えたアプローチは、タイムアウトを指定してEventWaitHandle.WaitOne
メソッド(またはその兄弟のいずれか)を使用することでした。問題は、これらのすべてのメソッドは、最大ブロック時間をおよそ25日間に制限するパラメータとしてInt32を取ることです。
誰にも解決策がありますか? Int32.MaxValueミリ秒以上スレッドをブロックするにはどうすればよいですか?専用のスレッドによって実行されるコードであるスニペット
while(_doRun)
{
// Determine the next trigger time
var nextOccurence = DetermineNextOccurence();
var sleepSpan = nextOccurence - DateTime.Now;
// if the next occurence is more than Int32.MaxValue millisecs away,
// loop to work around the limitations of EventWaitHandle.WaitOne()
if (sleepSpan.TotalMilliseconds > Int32.MaxValue)
{
var idleTime = GetReasonableIdleWaitTimeSpan();
var iterationCount = Math.Truncate(sleepSpan.TotalMilliseconds/idleTime.TotalMilliseconds);
for (var i = 0; i < iterationCount; i++)
{
// Wait for the idle timespan (or until a Set() is called).
if(_ewh.WaitOne(idleTime)) { break; }
}
}
else
{
// if the next occurence is in the past, trigger right away
if (sleepSpan.TotalMilliseconds < 0) { sleepSpan = TimeSpan.FromMilliseconds(25); }
// Wait for the sleep span (or until a Set() is called).
if (!_ewh.WaitOne(sleepSpan))
{
// raise the trigger event
RaiseTriggerEvent();
}
}
}
:
おかげ
UPDATEただ、レコードの
は、ここで私は最終的に思い付いたコードスニペットです。 EventWaitHandle.Set()
は、アプリケーションがスケジューラを終了するか停止するときにのみ呼び出されることに注意してください。
お寄せいただきありがとうございます。
本当にあなたのアプリケーションはそれほど長く実行できると思いますか?テスト中に23日に確かにクラッシュする –
私には何かのような音がデザインに間違っている。 – eurotrash
何らかのイベントでスレッドを開始する必要があります。または、スレッドを浪費しないタイマーを使用してください。 –