난 Await 없는 Task.Delay.Wait가 Thread.Sleep이랑 내부적으론 당연히 다르겠지만 유저레벨에선 차이가 없을 줄 알았는데
(대기의 정밀도는 차이를 체감하겠지만 논외로 치고)
의외로 Task.Wait가 현재 스레드가 대기하느라 완전히 차단되는게 아니었네
윈폼같이 현재 스레드에 메시지 루프가 있는 경우 '일부' 메시지만 '매우 느린속도로' 돌려주는데? ㅋㅋ 뭐지이거
실제로 WndProc 구현해놓고 체크해보면 메시지루프가 돌아가는걸 볼수있음
가령 Form을 만들고 Label.Text를 수정 한 후에 Show를 하고나서
Thread.Sleep으로 대기하면 라벨이 하얗게 표시가 안되지만
Task.Delay.Wait로 대기하면 라벨이 표시됨.
마찬가지로 그 상태에서 비동기로 짜지 않고 그냥 쭈욱 Label.Text 추가로 수정 후에 Task.Delay.Wait로 대기하면 좀 넉넉한 시간 대기하면
폼은 계속 응답을 못하는 먹통상태지만 라벨이 실제로 UI에서 다 바뀜!
(클릭등의 메시지는 안돌려줘서 클릭이벤트를 발생시키진 못하더라고)
근데 메시지 펌핑 속도가 엄청 느려서 실질적으로 써먹을 여지는 없는듯
그래도 웃기네 뭐여이거
나만 몰랐음?
실질적으로 쓰잘데기는 없는거니까 뭐 몰라도 괜찮겠지만
둘 다 스레드 블락일텐데 ㅇㅅㅇ? WndProc이 되는건 신기하네 ㅇㅅㅇ WndProc 이게 윈도우 메세지 받는거 아님 ㅇㅅㅇ?
그니까. 나도 당연히 UI스레드가 Wait 하는동안 완전히 차단될거라 생각했는데 그게 아니더라도. 실용적이진 않은데 의외의 차이가
혹시 async void 같은거 씀 ㅇㅅㅇ?
아니야 Async/Await 전혀 안썼어
신기하네 ㅇㅅㅇ
쓰레드 슬립은 커널 스케쥴러 레벨에서 나 잘테니까 꺠우지마라 이기야~ 아님?
ㅇㅇ 쓰레드 슬립은 그 예상대로 스레드 차단되고 메시지루프도 안돌아감. 근데 Task.Wait는 돌아가더라. 뭐 Task.Delay가 대기용 새 스레드 만들고 그 스레드 대기하면서 메인스레드가 일부 메시지를 펌핑하나본데.. 그래서 머리에 물음표 많이떴음
그 말이 정확한데요 이기야 ?
근데 또 그럴거면 '일부'메시지만 '매우 느린속도로' 펌핑하는 이유는 또 뭐지? ㅋㅋ 여기부턴 초보자한텐 넘 어려울거같애서 생각을 그만두기로 함
사실 물은 물이로다 고마 써라 게이야