2017-12-09 13 views
0

だから、私はこのようなループのwhileループを持っています。キーを使用してWhile(真)ループを終了するにはどうすればよいですか?

bool isTrue = true; 
while(isTrue) 
{ 
    //Do work over and over 
} 

私は疑問に思っています。現在のループ中にキーが押されたかどうかをチェックするif文を追加できますか?ループを中断することなく、ある種の非同期タスクがあるかもしれません。それは何度も何度もタスクを自動化しているからです。質問のために、それが印刷されているとしましょう。"Hello World!"を3秒ごとにコンソールに送信します。

+0

「何度もやり直してください」ではどのような作業が行われていますか?このコードを私たちに提示してください。最善の答えとは大きな違いが生じるかもしれません。 – Enigmativity

+0

checkout Console.KeyAvailable https://msdn.microsoft.com/en-us/library/system.console.keyavailable(v=vs.110).aspx –

+0

もしあなたが定期的(毎3秒)に何かしたいのなら、BackgroundWorkerクラス –

答えて

0

あなたのwhileループの条件として単にそれを持たせることはできません。 (真と条件){}の間に、またはブレークで本文のifステートメントを実行するだけです。

0

さまざまな方法で共有プロパティを使用できるように、クラスを設定することをお勧めします。

public class MyLooper 
{ 
    private bool KeepLooping { get; set; } = true; 

    public void OnKeyPressed() 
    { 
     KeepLooping = false; 
    } 

    public void StartLoop() 
    { 
     Task.Factory.StartNew(() => { 
      while (KeepLooping) 
      { 
       Debug.WriteLine("Hello World"); 
      } 
     }); 
    } 
} 

あなたはこれを実行する場所を指定していません。サーバー、デスクトップアプリケーション、コンソールなどがありますが、スレッドの安全上の問題に遭遇して対処する必要があります。

1

このようにループをwhileにするのは良い考えではありません。 1秒の3分の1ごとにコンソールに何かを書いていると、Thread.Sleepを使ってその時間を待っていることを示唆しています。

このようなことをするタイマーやその他のライブラリを使用する方がはるかに優れています。私はMicrosoftのReactive Frameworkを提案したいと思う。次に、これを行うことができます:

IDisposable subscription = 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0/3.0)) 
     .TakeWhile(_ => !Console.KeyAvailable) 
     .Subscribe(_ => 
     { 
      Console.WriteLine("Hello World!"); 
     }); 

ジョブが完了しました。早期に購読を停止したい場合は、subscription.Dispose()に電話してください。

NuGet必要なビットを取得するための "System.Reactive"。

関連する問題