항상 처리 지연 또는 비슷한 것을 생성하기 위해 Thread.Sleep()
을 사용하는 사람들을 보았습니다. 사람들은 항상 이런 식으로 사용하는 것을 비웃었습니다.언제 Thread.Sleep()을 사용하는 것이 현명합니까?
언제 Thread.Sleep()
을 사용하는 것이 바람직합니까?
항상 처리 지연 또는 비슷한 것을 생성하기 위해 Thread.Sleep()
을 사용하는 사람들을 보았습니다. 사람들은 항상 이런 식으로 사용하는 것을 비웃었습니다.언제 Thread.Sleep()을 사용하는 것이 현명합니까?
언제 Thread.Sleep()
을 사용하는 것이 바람직합니까?
실제로 백그라운드 스레드에서 지연이 필요할 때 Thread.sleep()
으로 전화해야합니다.
동기화를 돕기 위해 호출하지 말고, 뭔가 기다리기 위해 루프에서 호출하지 마십시오 (속도가 느림) UI 스레드에서 절대로 호출하지 마십시오 (동결됩니다.)).
그냥 추가 : 그리고 Thread.Sleep 중 하나를 사용하여 정확한 타이머를 만들지 마십시오. –
파일이나 네트워크 소켓에 대해 긴 처리를 수행하는 동안 백그라운드 스레드에서'Thread.Sleep'을 사용합니다 (스레드가 완료되면 콜백을합니다). 이것은'Thread.Sleep'을 위해 좋은 사용인가요 아니면 이것을하기위한 더 나은 마카니즘인가요? – Matthew
@Matthew 한 스레드의 작업을 수행하는 데 두 개의 스레드를 사용하는 것처럼 들리네. 수면 스레드는 주기적으로 일어나서 작업자 스레드가 여전히 작동하는지 확인하는 것 외에는 아무 것도하지 않습니까? 완료되면 작업자 스레드가 콜백 자체를 호출 할 수 없습니까? –
스레드가 무언가를하지 못하도록하고 싶다면 무한 루프를 만들 때 가끔 루프가 멈추지 않아야합니다. CPU 파워가 많이 걸리므로 thread.sleep을 추가해야합니다. 루프를 "휴식을 취하고"cpu에게 약간의 휴식을 줄 것입니다 ^^.
그런 프로그램을하려고한다면, 타이머를 사용합니까? – ediblecode
sleep() 호출을 대체하기 위해 타이머를 사용하는 방법 타사 스크립트 인터프리터 'OnProcessLine'이벤트에 있다고 가정하고, 다른 스크립트를 실행하는 여러 스레드 중 하나의 스택에 알 수없는 깊이가 있다고 가정합니다 타이머를 사용하여 어떻게해야합니까? –
이 매개 변수는 컨텍스트 전환 (매개 변수 1)을 강제하거나 다른 상위 우선 순위 스레드 (매개 변수 0)를 사용하는 데 사용될 수 있지만 .... 거의 필요하지 않습니다.
일부 폐품이나 테스트 코드에서 멈춤을 도입해야 할 때 Thread.Sleep()이 좋습니다.
프로덕션 코드에서는 다른 옵션을 찾아 보는 것이 가장 좋습니다. 예를 들어 일정한 기간에 무언가를하려한다면 많은 기존 타이머 클래스 중 하나를 사용하십시오. 입력 대기열이 비었을 때 (그리고 .NET에서) 일시 중지하려는 경우 Monitor.Wait()
및 Monitor.Pulse()
을 대신 사용해보십시오. 이 문서의 수면의 단점()의
더 (다시, .NET 중심) 설명 : Thread.Sleep is a sign of a poorly designed program.
+1 비 생산 코드 사용이 많으며 다중 스레드 프레임 워크 개발/데모시 장기 실행 작업을 시연하는 것이 유용합니다. 실제 작업을하기위한 자리에 서기 만하면됩니다. – Servy
이전에 링크 된 기사를 읽었습니다. 방금 다시 읽었습니다. 좋지 않았습니다. 두 번째로 더 나빴습니다. –
테스트 코드를 작성. 어떤 함수가 여러 스레드에서 무작위로 호출되는 것을 처리하는 방법을보고 싶다면.
또한 테스트를 위해 지연을 시뮬레이트하려는 경우. 진행률 표시 줄을 테스트하고 싶다고합시다.
내가 받아 들일 만하다고 생각하는 경우는 거의 없습니다. 궁극적으로 그것은 내 마음 속의 다음과 같은 상황에 이른다. 다른 사람들은 이것들이 적용되지 않는 경우에 소리내어 들일 수도 있지만, 경험적으로 볼 때, 아래의 것들 모두가 실재로 Thread.Sleep을 사용해야한다.) 일명 사소한 또는 테스트하지 코드 :
Thread.Sleep
이 필요한 경우 잘못된 디자인 일 수 있습니다. AutoResetEvent 또는 ManualResetEvent와 같은 동기화 메커니즘을 사용하고 이벤트가 발생할 때까지 기다립니다. 나는 종종 폴링을 Thread.Sleep
으로 만들었지 만 가능한 경우 이벤트를 사용하는 것이 좋습니다.
이 답변은 질문에 대한 대답이 없습니다. – ediblecode
나는 Thread.Sleep을 사용해서는 안되며 이벤트 메커니즘을 더 잘 사용한다고 말하고 싶다. 그게 네 질문에 대한 내 대답이 아닐지도 모르겠다. – BlueM
http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx의 위 응답에 언급 된 것과 같습니다. 참으로 나쁜 디자인의 징표입니다. ".NET에는 다른 이유가 없습니다." – BlueM
일반적으로 효과적인 (또는 오히려 효과가없는) 멀티 스레딩 디자인과 관련된 수면 사용에 대한 불만.멀티 스레딩은 큰 주제이며, 나는 당신에게 좋은 책을 소개 할 것이다. (Java Concurrency in Practice in Goetz).
고정 된 시간 동안 처리 코드를 지연 시키려면 sleep()을 사용하는 것이 좋습니다 (단, Timer 클래스는 정기적 인 동작을 구현하는 좋은 방법입니다).
타이머를 사용하면 개발자가 절차 사양을 구현하는 상태 시스템을 개발해야합니다. 연산이 더 단순한 단계의 시퀀스에 의해 정의되고, 종종 긴 간격으로 분리되면, 함수 호출과 sleep() 호출이 직접 매핑됩니다. 비동기 상태 머신은 그렇지 않습니다. –
'효과적인 (또는 오히려 효과가없는) 멀티 스레딩 디자인과 관련된 수면 사용에 관한 불만.' 이것은 매우 사실이지만, 슬프게도, 이것은 몇몇 사람들의 생각에서 '수면 (sleep)은 반 패턴이다'라고 해석한다. '매년 소방서, 구급차, 경찰 순양함은 수백 개의 교통 사고를 일으 킵니다. 따라서 그들은 모두 금지되어야합니다. –
작업이 오래 걸릴 때마다 사용하십시오. 사양에 '계속하기 전에 최소 10 초 기다려주십시오.'라고 표시되면 절전 (10000)을 호출하십시오. 대안이 있습니다. 코드를 상태 엔진으로 다시 작성하여 타이머 이벤트가 발생할 때까지 컨트롤을 항복 할 수 있습니다. 테이블 구동 상태 머신은 매우 유연하며 완전히 비동기 작동을 허용합니다. 그 결과 '코드'는 어떤 식 으로든 요구 사양을 닮지는 않을 것입니다. 디버깅하기가 어렵고, 수정하고, 유지하고 및/또는 강화하는 악몽이 무엇인지 이해하는 것은 거의 불가능합니다. 그러나 당신은 그 불쾌한 것을 피할 수 있습니다 , 안티 패턴 'Sleep (10000)'통화.
다른 사람이 게시 했으므로 스레드 간 통신에는 사용하지 마십시오! 모든 멀티 태스킹 OS에는 더 효과적인 sychro 메커니즘이 많이 있습니다.
왜 사람들은 왜이 질문에 투표하지 않았습니까? – ediblecode
-1 하나의 언어를 선택하십시오. 이 질문에 대한 답은 다른 도서관을 참조 할 것입니다. 이 질문에 동시에 두 가지 다른 언어를 묻는 것은 혼란 스럽습니다. –
@ErickRobertson 그래서 두 가지 질문을 만들어야한다고 말하고 있습니까? 나에게 중요하지 않은 것 같아. – ediblecode