2017-12-09 1 views
0

그래서이 while 루프는 이렇게 보입니다.키를 사용하여 While (true) 루프를 종료하려면 어떻게합니까?

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

궁금합니다. 현재 루프가 중단 될 때 키를 눌렀는지 확인하는 if 문을 추가 할 수 있습니까? 루프를 방해하지 않고 일종의 비동기 작업을 할 수 있습니까? 그것은 작업을 반복해서 자동화하기 때문입니다. 질문을 위해서 인쇄하고 있다고 가정 해 봅시다. "Hello World!"은 3 초마다 콘솔에 전송됩니다.

+0

'Do more over and over'에서 어떤 일이 일어나고 있습니까? 이 코드를 우리에게 보여줘야합니다. 가장 좋은 답변은 큰 차이를 만들 수 있습니다. – Enigmativity

+0

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

+0

하지만 정기적으로 (각 3 초) 무언가를하고 싶다면 BackgroundWorker를 사용하십시오. 수업 –

답변

0

while 루프의 조건으로 사용하면 안됩니까? while (true 및 condition) {} 또는 휴식 시간에 본문에서 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"를 사용하면 필요한 비트를 얻을 수 있습니다.

관련 문제