내 응용 프로그램이 동결 된 후 Task.Delay()
(또는 .NET 4.0의 경우 TaskEx.Delay()
)으로 생성 된 TimeSpan
컴퓨터에서 발생하는 작업을 기다리는 스레드의 원인을 추적하여 버그로 인해 TimeSpan
TotalMilliseconds
은 -1
이하이고 -2
보다 큼 (즉, -10000 ~ -19999 틱 범위의 모든 위치).Task.Delay()가 무한 지연을 허용하는 이유는 무엇입니까?
이 설정 (당신이 -2
밀리거나 낮은 음의 TimeSpan
통과 할 때,이 방법은 올바르게 ArgumentOutOfRangeException
발생하지만, 위에 설명 된 범위에서 음의 시간 범위를 제공 할 때,이 완료 결코 Task
반환 나타납니다 밑에있는 System.Threading.Timer
은 dueTime
으로 -1은 무한 함을 나타냄). 즉, 해당 작업에 설정된 연속성은 결코 실행되지 않고 에 .Wait()
에 발생하는 불량 스레드는 영구적으로 차단됩니다.
완료되지 않은 Task
에는 어떤 용도로 사용할 수 있습니까? 누구나 그러한 반환 가치를 기대합니까? 해당 범위의 값을 포함하여 .Delay()
에 음수 값이 전달되면 ArgumentOutOfRangeException
을 던지시겠습니까?
MSDN 문서는 -1을 사용하는 것에 대해 매우 명시 적이므로 올바르게 작동하는 것으로 보입니다. 해당 오버로드에 대한 유스 케이스는 확실하지 않지만 취소 토큰을 사용하는 오버로드로 인한 '그냥'취소를 기다릴 수있는 방법 일 수 있습니다. –
@James : -1을 허용하는 것이 명시 적이지 않습니다. -1보다 낮은 값을 허용하지 않는 것이 명백합니다. 'System.Threading.Timer'의 문서와 달리, -1을 전달하면 어떤 일이 일어날 지 말조차하지 않습니다. 문서화 된 예외 목록이 소스 코드에서 자동으로 생성 된 것처럼 보입니다. 그리고 '그냥'취소를 기다리고 있다면, 왜'Task.Delay()'를 호출할까요? –
깨진 것 같으면 connect에 버그를 신고하십시오. "-1보다 낮은 것"이라고하는 문서는 -1이 유효하다는 것을 명시 적으로 말합니다. 의도가 -1 인 경우 "0보다 낮다"가 유효하지 않으므로 쓰기가 쉬울 것입니다. 의사와 코드 모두 -1을 허용하기 때문에 이것은 By Design에 의한 것이라고 생각하지만 연결에 버그가 있으면 자유롭게 파일을 보냅니다 (BCL 팀에서 임의의 SO 스레드보다 처리 가능성이 높음) –