디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Thread.Sleep과 Task.Delay 설명 자세히 해봤어(수정)

음음엄(67.188) 2017.06.30 14:50:43
조회 21741 추천 26 댓글 36
														


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452c7dec3b8ec9c9da7af51e25b


자 일단 소스코드는 이거야. 굳이 Sleep test하는데 웬 Task.Run? 할테지만 일단 한번 끝까지 봐바.


내가 말하는 내용을 모두 이해 한다면 Task.Run을 사용한 이유도 이해가 될꺼야



일단 각자 method들 설명을 좀 봐볼까?


먼저 Thread.Sleep이야


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452c6dcc3eee89fccf2af51e25b


특별한거 없지? 우리가 알고있는 그 Sleep이 맞아. 밀리세크 수만큼 스레드가 블락 된대


다음 Task.Delay를 한번 봐볼까?


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452c0d9c3e5e6c89ff5af51e25b


오 먼가 설명이 약간 달라.. 반환된 Task를 연산하기 전에 밀리세크만큼 기다린대.

일단 뭐 조금 다르다는 느낌정도지?

그리고 빨간색으로 표시된 awaitable Task가 우리가 주목해야 할 부분이야.

일단은 뒤에가서 다시 보자구.



바로 위에 코드가 있지만, 상기겸 코드를 다시 한번 봐볼까?

viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452c0d4c1b8bcc89df3af51e25b

자 문제를 내볼게, 출력 순서가 어떻게 될 것 같아?

Console.WriteLine에 찍고있는 숫자를 기준으로 생각해 주면 될 것 같아.

물론 프갤에 고수형들 많으니까 내가 지금 뭐하는건지 눈치 챈 형들도 있을꺼.

이미 내용 알면 걍 살포시 뒤로가기 눌러주면 돼


자 이제 모르는 형들만 남았겠지? 더 진행 해볼게, 바로 출력 결과를 보여주면

viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452918fc4eeed9fc0a2af51e25b


출력 순서는 위와 같아.



혹시 "당연한거 아냐? 이거 말할라 했냐 ㅄ" 하는 형들은 아직까지 안나가고 머함? 빨리 뒤로가기 누르셈



만약에 async/await를 모르는 형들은 오잉? 했을꺼, 1, 2, 3, 4가 출력 될 것 같이 생겼는데 결과는 1, 2, 4, 3이지?


심지어 시간도 봐바. 4가 출력된 시간은 2가 출력된것과 같은 52초야


그리고 또 하나 주목 할 부분은, ManagedThreadID야.


1, 2, 4를 찍을때는 ManagedThreadID가 3인데, 헉.. 4찍을때 ThreadID 출력 안했네.. 쟤도 3이라고 찍혀 틀림없어 날 믿어.



특이하게 마지막 3: 4라고 찍히지?(녹색박스)


일단 이거 설명은 아래에서 하고, 대체 왜 3보다 4가 먼저 찍혔는지, 그리고 왜 또 시간은 52초에 찍혔는지 먼저 알아보자구


아까 Task.Delay 설명글에서 내가 빨간 박스 쳤던거 기억하지?


awaitable이라고 되어있던 부분 말야.. awaitable 함수는 보통 async/await 키워드와 함께 사용하거나,


return되는 Task를 실행 해야지 원하는 결과를 얻을 수 있어


자 그럼 async/await이란 무엇이냐!


async/await 키워드는 .net 4.0때 얼굴을 내비친 아이야..


내 개인적인 추측이지만, 늅늅충들이 Winform/WPF에서 하도 UI Thread로 block wait를 걸어놓고


UI 행걸린다고 징징대서 MS가 넣은걸로 추정됨. 그리고 go lang에서도 지원하고있고


c++또한 현재 구현 들어와 있어(c++은 정확히 언제 들어왔는지 잘 모르겠다..)



결론을 말해주면, async/await는 동작이 조금 특이한데, await가 걸리는 시점에서 함수 호출자는 return이 돼.


await의 의미를 말로 풀어보면, 


"이건 시간 좀 걸리는 함수니깐 넌 니 할일 하러 돌아가. 이거 함수 결과 오면 형이 아래코드들 실행하라고 말해줄겡"


하는 거라고 생각하면 돼



그림으로 순서를 설명해보면,


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a8452c38fc6bcecca9fa7af51e25b


앞서서 출력 결과물 봤지? 실제 코드도 위와같이 실행이 돼.


Task.Sleep을 수행하러 들어온 (빨간색)Thread는 3에서 block wait로 1초를 기다리고, 4를 수행하지.


이때 동작은 말그대로 block wait야. 이때 스레드는 바보처럼 마냥 1초를 기다리게 되지.


(c++은 APC라도 있어서 요 스레드가 뭔가 할걸 기대라도 할 수 있지만, C#은 그런거 없어. 쟤는 그냥 ㅄ같이 걍 대기임)


요 Sleep을 한 Thread가 UI Thread였다고 생각해봐. 1초간 프로그램이 응답이 없었겠지?


안타깝게도, UI Thread한테 이런식으로 block wait를 시키는 개발자들 많더라고...


토달지마 내가 봤다고



다시 말하지만, 이런 증상을 해결 해 줄 수 있는게 async/await야.


(빨간)Thread는 5에서 await을 만난 순간, awaitable한 (녹색)Task.Delay를 프레임웤에게 실행해 달라고 부탁해.


물론 이때 (노랑)8번 코드 영역도 함께 던지게 되지. (녹색)7 부분 실행을 하고 나면 이후에 실행 해 달라고..



이걸 어떻게 아냐고? 다시한번 앞의 결과물을 봐볼까?


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bb107aeb70716d6568a845291dec6eaee9bc8f0af51e25b


코드에도 나와 있지만, 그리고 다시 말하지만, 콜론으로 구분되는 두번째 공간에 찍힌 숫자의 의미는 Managed Thread ID야.


분명히 두번째 라인을 출력한 아이는 ManagedThreadID가 3인데,


동일 함수 내에 있는 세번째 Console.WriteLine을 실행한 아이의 ManagedThreadID는 4지?


이 결과물이 그 증거야.




그래도 못믿겠다고? 소설을 쓰라고?


그래 분명 이러는 사람들 있음.


그래서 더 준비함


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28b77a16fb3dab004c86b6fdc843afe757eec56b87102ec3efadaa93a82671bde0bf753ffde0215d3538c8f340b2bd6a304a093a0ae327672f61de5b6


위에 제공한 샘플 프로그램 빌드하고 IL을 까보면 대략 이렇게 나와


위에 보면 Console.WriteLine("2 : ... 실행하는 코드 아래쪽 영역인데, 


잘 보면, 먼가 꽁냥꽁냥 열씸히 보따리 싸서 실행지점 던져놓고 지는 바로 나가는 코드가 보이지?


그리고 보따리 쌀때 호출 주소 쫒아가 보면 우리가 소설을 쓰고 있었던 Console.WriteLine("3 : ... 부분이 보여



이제 대충 알겠지?


좀 산만한 내용을 보충하기 위해 요약을 다시 한번 하면 아래와 같아.


Thread.Sleep : 현재 요 Method를 수행하는 놈을 Block wait 시키고 wait가 끝났을때 동일 Thread를 하부 코드 실행하도록 풀어준다.

Task.Delay : 현재 요 Method를 수행하는 놈을(await 했을때) 바로 호출 지점으로 돌려 보내고, 다른 스레드를 통해 하부 코드를 실행 하도록 시킨다.


ㅇㅋ?






추천 비추천

26

고정닉 2

1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47961 65
2896653 쌉소리 말고 타로사이트 수정이나 해라 ㅇㅇ ㅇㅇ(124.48) 21:18 4 0
2896652 저장용 ♥덩냥이♥갤로그로 이동합니다. 21:16 6 0
2896647 나님 집 주소 인증⭐ [3] ♥덩냥이♥갤로그로 이동합니다. 21:00 30 0
2896646 한국일본이용하는 미국..우린 중러가 필요하다 [1] 발명도둑잡기(211.246) 20:59 14 0
2896645 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 20:51 11 0
2896644 김건희 석방 에어로홍갤로그로 이동합니다. 20:51 8 0
2896643 윤석열 석방 에어로홍갤로그로 이동합니다. 20:51 9 0
2896642 발명도둑잡기 이사람 저를 사칭합니다 [2] 에어로홍갤로그로 이동합니다. 20:48 34 1
2896641 남들은 프리뛰면 금방 1천번다는데 난 왜 이래 힘드냐 [4] ㅆㅇㅆ(124.216) 20:41 44 0
2896640 디스코드 좆목충 새끼들은 [1] ㅇㅇ(175.223) 20:41 45 0
2896639 에어로홍 사칭 발명도둑잡기(211.246) 20:39 19 0
2896638 불쾌한 고주파.. 설마.. ♥덩냥이♥갤로그로 이동합니다. 20:23 11 0
2896637 … 날카롭고도 서늘한 모기의 기척.. ♥덩냥이♥갤로그로 이동합니다. 20:23 10 0
2896636 귀염❤+ ♥덩냥이♥갤로그로 이동합니다. 20:18 12 0
2896635 젊은 세대들을 비난하는 꼰대들의 역사.jpg 발명도둑잡기(118.235) 20:17 15 0
2896634 식후 4시간은 되야함 ♥덩냥이♥갤로그로 이동합니다. 20:15 9 0
2896633 나님 자토이치가 되기 위해 눈 감고 다녀야징 ♥덩냥이♥갤로그로 이동합니다. 20:09 12 0
2896632 내 범위가 너무 넓으니까 오히려 클라이언트쪽에서 못미더워하더라 [2] ㅆㅇㅆ(113.192) 20:08 42 0
2896631 초코냥나트륨찡프공피에로냥펀딱국딱군설리장인웹히키프갤로메타피보나치나와주세요 Meow갤로그로 이동합니다. 20:06 31 1
2896630 커피는 독약,마약이당 ♥덩냥이♥갤로그로 이동합니다. 20:05 13 0
2896629 모기 제발 죽었길.. ♥덩냥이♥갤로그로 이동합니다. 20:03 13 0
2896628 일단 내 타로 홈페이지 주간까지 어떻게든 완성하고 [2] ㅆㅇㅆ(113.192) 20:00 25 0
2896627 현재 공부중인거 인증한다 시발새기들아 [6] Meow갤로그로 이동합니다. 19:58 56 0
2896626 공유기 와이파이 해킹당하면 악성코드가 폰으로 옴? [10] ㅇㅇ(149.88) 19:54 42 0
2896625 너네도 건강검진 함 받아봐라 [4] ㅆㅇㅆ(113.192) 19:54 43 0
2896624 ㅆㅇㅆ님 제말을 믿어주세요 에어로홍갤로그로 이동합니다. 19:51 27 0
2896623 미야우 묻습니다 에어로홍갤로그로 이동합니다. 19:50 17 0
2896622 이번에 건강검진 피검사 받아보니까 과로로 간이랑 [2] ㅆㅇㅆ(113.192) 19:49 31 0
2896621 윤석열 석방 [3] 에어로홍갤로그로 이동합니다. 19:49 38 0
2896620 재명이가 짒값 올려준다니까 앞으로 3일간 까방권 준다 [2] ♥덩냥이♥갤로그로 이동합니다. 19:44 22 0
2896619 이런 문장 되게 좋지 않니? ㅇㅇ갤로그로 이동합니다. 19:44 15 0
2896618 나다 ㅋ 나 미야우 왔다 [9] Meow갤로그로 이동합니다. 19:43 49 0
2896617 ㅇㅅㅇ ♥덩냥이♥갤로그로 이동합니다. 19:43 10 0
2896616 가을모기 생존력 존나쌤;; 모기약 존나 뿌려도 안 죽음;; ♥덩냥이♥갤로그로 이동합니다. 19:41 11 0
2896615 쿠팡노동이야말로 한국 내 캄보디아라고 할 수 있다 발명도둑잡기(118.235) 19:13 16 0
2896614 아는 것을 안다 하고 모르는 것을 모른다 하는 것이 아는 것이다 발명도둑잡기(118.235) 19:09 16 0
2896613 도박과 부동산투기의 공통점 [2] 발명도둑잡기(118.235) 19:04 18 0
2896612 토지는 품질 상태가 고정되어있는데 상품취급하는 것부터 문제 [1] 발명도둑잡기(211.246) 18:59 15 0
2896611 항상 배움이 부족한거 같다. 그런 생각이 들어 [8] ㅆㅇㅆ(113.192) 18:55 51 0
2896610 3840 * 2160 세상이 유일한 락입니다 나르시갤로그로 이동합니다. 18:53 12 0
2896609 리눅스에서 한글 입력 개판인 이유 ㅋㅋ [1] 나르시갤로그로 이동합니다. 18:48 32 0
2896608 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 18:48 10 0
2896607 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 18:42 13 0
2896603 [대한민국] 세상이 혼세할 때 나타나는 현상 - 이 조 단위 돈 싱가포르 프갤러(121.172) 17:37 19 0
2896602 이재명 대통령님 ㅆㅅㅌㅊ !! [2] ♥덩냥이♥갤로그로 이동합니다. 17:32 43 0
2896601 친중극좌 재명이가 절대 못하는거 ㅇㅅㅇ [2] ♥덩냥이♥갤로그로 이동합니다. 17:16 42 0
2896599 야밤에 가을모기한테 습격 받은 타격이 이제야 회복 되는듯? ♥덩냥이♥갤로그로 이동합니다. 16:53 32 0
2896598 이런 소켓 연결 실패! 프갤러(121.172) 16:47 56 0
2896597 토지거래허가구역 지정 이거는 꼭 나쁜가? [2] chironpractor갤로그로 이동합니다. 16:31 80 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2