기다리는 Thread.Sleep를 얻는 방법?


139

대기 / 수면 패러다임을 기반으로 네트워크 바인딩 응용 프로그램을 작성 중입니다.

때로는 연결 오류가 발생하며 경험상 잠시 기다렸다가 다시 작업을 다시 시도하면 비용이 발생합니다.

문제는 Thread.Sleep 또는 다른 유사한 차단 작업을 await / async에서 사용하면 호출자 스레드의 모든 활동을 차단한다는 것입니다.

Thread.Sleep (10000)을 다음과 같은 효과를 얻기 위해 대체해야 할 것

await Thread.SleepAsync(10000)

?

최신 정보

추가 스레드를 만들지 않고이 작업을 수행하는 답변을 선호합니다

답변:


323

새로운 스레드 시작을 제안하는 다른 답변은 나쁜 생각입니다. 아무 것도 할 필요가 없습니다. async/ 지점의 일부는 응용 프로그램에 필요한 스레드 수 await줄이는 것입니다.

대신 사용해야 Task.Delay하는 없습니다 새 스레드를 필요로하며,이 목적을 위해 정밀하게 설계되었습니다 :

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

나는 여전히 a4.5 물건을 다루고 있습니다. 그 문장 다음에 코드에서 실행 지점은 어디에 있습니까? 비 잠자기 / 차단 부분이 대기하거나 '스레드'를 실행합니까? 주요 비 차단 실행이 블록을 계속 떠나는가 (일명 리턴)?
kenny

1
네. 이것이 바로 내가 필요로하는 것
Arsen Zahray

1
@kenny : 내 async소개가 도움이 될 수 있습니다. 에 의해 리턴 된 awaitable Task.Delayawait완료되지 않았으므로 현재 메소드는 완료되지 않은 태스크를 리턴합니다. 나중에 Delay(스레드가 아닌 타이머가 아닌) 완료되면 나머지 메소드가 실행되도록 예약됩니다. 연속은 "컨텍스트"에서 실행되며 동일한 원래 스레드로 돌아갈 수 있습니다 -내 블로그의 세부 사항.
Stephen Cleary

@StephenCleary 감사합니다. 대기 후 코드가 실행을 위해 '예정'되고 호출 스레드가 반환된다고 말하는 것이 옳습니까?
kenny

2
예, 호출 스레드는 (즉시) 반환하고 이후의 코드 await는 (최종적으로) 예약됩니다.
Stephen Cleary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.