2 ~ 3 초 동안 지연을 추가하는 방법 [닫기]


129

C #에서 프로그램에 지연을 추가하려면 어떻게해야합니까?


2
여러 가지 방법이 있지만 지연을 추가해야합니까? 우리가 알면 가장 적절한 방법을 제안 할 수있을 것입니다.
ChrisF

3
이 질문은 Thread.Sleep ()를 추천하기 위해 절망적으로 문서화되어 있지 않습니다.
Hans Passant

1
명확히하기 위해, 나는 누군가가 좋은 품질의 대답을 할 수있는 충분한 세부 정보를 제공하지 않았기 때문에이 질문을 끝내기로 투표했습니다. 정확히하려는 일에 대해 더 자세한 내용을 추가하면 올바른 질문으로 다시 열겠습니다. 조기 마감 투표는 품질이 좋지 않은 질문에 대한 "소음"답변의 홍수를 방지하는 방법입니다. 더 자세한 내용을 추가했으면 의견을 남기거나 모드를 다시 열어서 표시하십시오.
코디 그레이

14
이 질문을 끝내려는 잘못된 결정. 그것은 질문이며, 본질적으로 일반적인 것이 좋습니다. 나는 그것을 완벽하게 이해했습니다.
user2430797

5
그러나 내가 찾던 또 다른 질문은 아무런 이유없이 닫힌 질문에 대한 답변입니다.
Glenn Maynard,

답변:


176

Thread.Sleep()예를 들어 기능을 사용할 수 있습니다

int milliseconds = 2000;
Thread.Sleep(milliseconds);

있음이 완전히 중지 2 초 현재 스레드의 실행.

아마도 가장 적합한 시나리오 Thread.Sleep는 메인과 다른 다른 스레드에서 작업을 지연하려는 경우입니다.

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

다른 시나리오 (예 : 시간이 지난 후 작업 시작 등)의 경우 Cody 's answer를 확인하십시오 .


13
Thead.Sleep 원인을 사용하지 마십시오. 지속 시간이 끝날 때까지 현재 스레드가 모든 작업을 수행하지 못하도록 완전히 차단합니다.
Mohammed Swillam

7
@Mohammed : 예, 물론 트레드를 완전히 차단합니다. 그러나 때로는 유용 할 수 있습니다. 그것은 실제로 OP가 필요로하는 것에 달려 있습니다 ...
digEmAll

12
새 답변을 게시 할 수 없으므로 의견을 말하고 싶습니다. 프로그램을 차단하지 않으려면을 사용할 수 있습니다 await Task.Delay(milliseconds). 이것은 나를 위해 일했다 :)
SaiyanGirl

내 경우에는 다른 사람이 작성한 프로그램의 일부에서 호출되었으므로 기다릴 수 없었습니다. 기다릴 수는 없지만 "매달려"있으면 10 초 동안 작업 한 후에 물건을 종료 할 수 있습니다. 잠자는 2 초는 매력처럼 작동합니다.) 어떤 경우에는 이것이 방법입니다.
ecth

@MohammedElSayed : 대답은 다릅니다. 그것은 모두 사용 의도에 달려 있습니다. 필자의 경우 데이터베이스에 삽입 할 때 인덱스 제약을 피하기 위해 스레드를 0.6 초 동안 정확하게 잠 자야합니다.
GunWanderer

61

간격이 2-3 초로 설정된 타이머를 사용하십시오.

작성중인 응용 프로그램 유형에 따라 세 가지 옵션 중에서 선택할 수 있습니다.

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Thread.Sleep스레드를 Sleep완전히 잠그고 다른 메시지를 처리하지 못하도록 응용 프로그램에서 해당 스레드의 입력 (WinForms, WPF)을 동시에 처리해야하는 경우 사용하지 마십시오 . 단일 스레드 응용 프로그램 (대부분의 경우)을 가정하면 의도 한대로 작업을 지연시키는 것이 아니라 전체 응용 프로그램의 응답이 중지됩니다. 처리하거나 별도의 스레드에 "이벤트"가 없기 때문에 순수 콘솔 응용 프로그램에서 절전 모드를 사용하는 Task.Delay것이 좋습니다 (또한 더 나은 옵션 임).

및 타이머뿐만 아니라 Sleep당신이 사용할 수있는 Task.Delay비동기 버전 인 Sleep이벤트를 처리에서 스레드를 차단하지 않는 (적절하게 사용하는 경우를 -로 무한 잠을 끄지 마십시오 .Wait()).

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

C # 7.1 ( MSDN 블로그의 Async main)을 사용하는 경우 콘솔 응용 프로그램 await Task.Delay(2000)Main방법 에서도 동일 하게 사용할 수 있습니다 .

참고 : 작업 지연 Sleep은 timer /로 여러 작업을 잠재적으로 시작할 때 발생하는 경쟁 조건을 피하는 이점이 Delay있습니다. 불행히도 UI 기반 응용 프로그램을 동결하는 것은 허용되지 않으므로 여러 지연을 시작하면 (예 : 버튼 클릭으로 트리거되는 경우) 어떤 버튼을 사용하지 않도록 설정하거나 타이머 / 작업을 취소하거나 지연되도록하십시오 안전하게 여러 번 작업을 수행 할 수 있습니다.


5
콘솔 응용 프로그램 인 경우 Thread.Sleep경고가 중요하지 않을 수 있습니다.
Merlyn Morgan-Graham

1
네 번째 타이머 인 System.Web.UI.Timer 는 정기적 인 간격으로 비동기식 또는 동기식 웹 페이지 포스트 백을 수행하는 ASP.NET 구성 요소입니다.
David

1
최고 답변이어야합니다. 이것이 타이머 중 하나를 사용하는 예가 있다면 더 많은 투표권을 얻게 될 것입니다.
Mercutio

코디 그레이, 당신은 추가 할 수 있습니다 await Task.Delay()콘솔 응용 프로그램이 실제로 가능성이 있다는 버전 및 인라인 주석을 원하는 사용 Sleep(비 비동기 Main) 또는 Delay(비동기 Main)
알렉세이 Levenkov

1
@CodyGray가 완료되었습니다.
Alexei Levenkov

39

2.3 초 동안 다음을 수행해야합니다.

System.Threading.Thread.Sleep(2300);

6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

또는 using진술로 :

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

나는이 선호하는 1000 * numSeconds(또는 간단히 3000)는 사용하지 않은 사람에게 무슨 일이 일어나고 있는지 더 분명하게하기 때문에 Thread.Sleep전에. 의도를 더 잘 문서화합니다.


2
TimeSpan이 1000 이상인 경우 +1
Lefty

.NET 4부터는 Thread.Sleep(TimeSpan)int로 캐스트하지 않고 직접 사용할 수 있습니다 .
Holf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.