2017-06-15 16 views
0

真であることを待つものを実装しようとしています。ブール値が真でない場合、エラーメッセージコードを実行します。最大5秒間待ちます。

これは私が今やっていることです。しかし、この方法はすべてのケースで5秒間待つだけで時間が無駄になります。変数が真になるとすぐに実行されるような何かを私はどうすればできますか?

Thread.Sleep(5000); 
if (imageDisplayed == true) { 
    //success 
} 
else { 
    //failed 
} 
+0

をリセットするためにt.Start()t.Reset()を使用するタイマーを起動します。 – TGarrett

+1

あなたが行うべきことは、コールバックを呼び出す、完了したことを示す 'Task'を返す、それが完了したことを示す、タスクが終了したことを示すようなブール値を設定することよりもはるかに良いことをする作業を実際に行っているコードを変更することです。イベントなど – Servy

答えて

3

これにはManualResetEventを使用する方がよいでしょう。

// Somewhere instantiate this as an accessible variable to both 
// display logic and waiting logic. 
ManualResetEvent resetEvent = new ManualResetEvent(false); 

// In your thread where you want to wait for max 5 secs 
if(resetEvent.WaitOne(5000)) { // this will wait for max 5 secs before continuing. 
    // do your thing 
} else { 
    // run your else logic. 
} 

// in your thread where you set a boolean to true 
public void DisplayImage() { 
    // display image 
    display(); 

    // Notify the threads waiting for this to happen 
    resetEvent.Set(); // This will release the wait/lock above, even when waiting. 
} 

ルール。本当に本当に本当に良い理由がないかぎり、プロダクションコードの中で睡眠を使用しないことをお勧めします。

+0

ありがとうございましたが、リセットを忘れることはありませんでしたか? 'AutoResetEvent'を使ってこれを行うことはできますか? – user1984300

+0

設定後にresetEvent.resetを呼び出すことで、適切にリセットできます。 AutoResetEventを使用すると、設定されているときにコントロールがなくなるため、あなたのケースでは直接的ではありません。 – bastijn

0

あなたの睡眠を「昼寝」に寝かします。 ;)

for (int n = 0; n < 50; n++) 
{ 
    Thread.Sleep(100); 
    if (imageDisplayed) 
    { 
     // success 
     break; 
    } 
} 
//failed 

瞬間的にではなく、最大100msの遅延があります。

0

タイムアウト変数を、待機を停止し、それを待機中のチェックと一緒にwhileループの条件として使用する時間に設定できます。以下の例では、私達はちょうどチェック間の第二の第十のために眠る、しかし、あなたが合うように、あなたは睡眠時間を調整する(または削除)することができます

var timeout = DateTime.Now.AddSeconds(5); 

while (!imageDisplayed && DateTime.Now < timeout) 
{ 
    Thread.Sleep(100); 
} 

// Here, either the imageDisplayed bool has been set to true, or we've waited 5 seconds 
0

whileループを使用し、あなたのためのインクリメンタルチェック条件

var waitedSoFar = 0; 
var imageDisplayed = CheckIfImageIsDisplayed(); //this function is where you check the condition 

while(waitedSoFar < 5000) 
{ 
    imageDisplayed = CheckIfImageIsDisplayed(); 
    if(imageDisplayed) 
    { 
     //success here 
     break; 
    } 
    waitedSoFar += 100; 
    Thread.Sleep(100); 
} 
if(!imageDisplayed) 
{ 
    //failed, do something here about that. 
} 
-2

System.Timers.Timerクラスを使用したいと思うようなサウンドです。それが真の

System.Timers.Timer t; 
    private bool val; 
    public bool Val { 
     get { return val; } 
     set 
     { 
      if (value == true) 
       // run function here 
      val = value; 
     } 
    } 

その後、セットアップごとに5秒間あなたのタイマー間隔に設定されているときに、あなたのブール変数が関数を実行するための

セットアップ。

public Main() 
    { 
     InitializeComponent(); 

     t = new System.Timers.Timer(5000); 

     t.Elapsed += T_Elapsed; 
    } 

    private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     throw new Exception(); 
    } 

単に行為を行う、それは時間を打つとあなたはすぐにそのためのwhileループを行う、とすべきタイマー

+0

は 'val'は' imageDisplayed'ですか? –

+0

はい、それは正しいです、私は単に理論を説明していた – AviatorBlue

関連する問題