2016-11-16 1 views
-4

私は実行中のスレッドを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()は、アプリケーションがスケジューラを終了するか停止するときにのみ呼び出されることに注意してください。

お寄せいただきありがとうございます。

+0

本当にあなたのアプリケーションはそれほど長く実行できると思いますか?テスト中に23日に確かにクラッシュする –

+11

私には何かのような音がデザインに間違っている。 – eurotrash

+0

何らかのイベントでスレッドを開始する必要があります。または、スレッドを浪費しないタイマーを使用してください。 –

答えて

0

お試しhandle.WaitOne(System.Threading.Timeout.Infinite)

無限に実行したくない場合は、別のスレッドから外部に待機ハンドルをトリガーします。

UPDATE:

あなたが別のスレッドを使用しない場合は、ループを使用します。あなたはInt32に収まる複数のチャンクにあなたのタイムアウトのタイムスパンを分割する必要があり

bool isTriggered = false; 
while (!isTriggered) { 
    isTriggered = handle.WaitOne(timeout); 
    //Check if time is expired and if yes, break 
} 

を。 isTriggered変数には、ハンドルがトリガされたか、タイムアウトしたかが表示されます。

+2

答えを下落させた質問者であったかどうかは分かりません。 – stuartd

+0

十分に公正です。このスレッドに関しては、私はドンです。 – Sefe

+0

@Sefe私はダウン投票しませんでした(とにかく評判ポイントが足りません)。しかし、あなたが提案している回避策では、通過する時間を知るために別のスレッドが必要になります。 – JuiceOntour

関連する問題