... | ... | @@ -426,15 +426,17 @@ else |
|
|
|
|
|
1. await를 사용하면 항상 쓰레드가 자동으로 만들어지는가?
|
|
|
|
|
|
await가 보장하는 것은, Task가 UI Thread에 돌던지, Worker thread에서 돌던지 상관없이 Task 완료 후 await 이후의 실행문들을 디폴트로 원래 await를 실행하기 전의 Thread에서 실행하도록 보장하는 것이다.
|
|
|
await가 보장하는 것은, Task가 UI Thread에 돌던지, Worker thread에서 돌던지 상관없이 Task 완료 후 await 이후의 실행문들을 디폴트로 원래 await를 실행하기 전의 Thread에서 실행하도록 보장하는 것이다.
|
|
|
|
|
|
하지만 내가 실험하는 환경은 콘솔 어플리케이션이다. 콘솔 어플리케이션은 Thread pool SynchronizationContext를 가지기 때문에 await 이후의 부분이 thread pool thread에 스케쥴링된다. 그래서 [이곳](#비동기-호출) 코드를 보면 실행 전, 후의 ThreadId가 다르다. 이것 때문에 await가 스레드를 만드는 것으로 보였던 것이다.
|
|
|
하지만 내가 실험하는 환경은 콘솔 어플리케이션이다. 콘솔 어플리케이션은 GUI와 달리 Thread pool SynchronizationContext를 가지기 때문에 await 이후의 부분이 thread pool thread에 스케쥴링된다. 그래서 [이곳](#비동기-호출)의 코드를 보면 실행 전, 후의 ThreadId가 다르다. 이것 때문에 await가 스레드를 자동으로 만드는 것처럼 보였던 것이다.
|
|
|
|
|
|
[async/await 관련 글](http://egloos.zum.com/sweeper/v/3193944)
|
|
|
[SynchronizationContext 관련 글](http://mhchoi8423.tistory.com/18)
|
|
|
[async/await 관련 글](http://egloos.zum.com/sweeper/v/3193944)
|
|
|
[SynchronizationContext 관련 글](http://mhchoi8423.tistory.com/18)
|
|
|
|
|
|
|
|
|
**MSDN 참고**
|
|
|
The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active.
|
|
|
|
|
|
비동기 메서드는 비차단 작업입니다. 비동기 메서드의 await 식은 대기한 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다. 대신에 이 식은 메서드의 나머지를 연속으로 등록하고 제어 기능을 비동기 메서드 호출자에게 반환합니다.
|
|
|
async 및 await 키워드로 인해 추가 스레드가 생성되지 않습니다. 비동기 메서드는 자체 스레드에서 실행되지 않으므로 다중 스레드가 필요하지 않습니다. 메서드는 현재 동기화 컨텍스트에서 실행되고 메서드가 활성화된 경우에만 스레드에서 시간을 사용합니다. Task.Run을 사용하여 CPU 바인딩 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 프로세스를 지원하지 않고 결과를 사용할 수 있을 때까지 기다립니다.(MSDN)
|
|
|
|
|
|
2. await Task.Delay() 했을때와 await fs.ReadAsync() 했을 때 blocking 동작이 다른 이유는 무엇인가?
|
|
|
|
... | ... | @@ -528,7 +530,10 @@ class MultiAwaitTest |
|
|
```
|
|
|
|
|
|
4. Task에 대한 스터디 보강 (thread는 리턴값이 있는가? Task와 thread 차이는 무엇인가? 왜 Task 타입을 정의했을까?)
|
|
|
|
|
|
5. Random 클래스의 seed 역할은 무엇인가?
|
|
|
그냥 Random() 메서드가 발생시키는 난수는 항상 규칙적이다. 이를 의사 난수(pseudo-random number) 라고 한다. 의사 난수는 seed 값에 따라서 결과값이 달라지는데, 이 seed 값이 같으면 매번 같은 결과값이 나온다. 그래서 보통 seed 값에 시간을 넣어 Random() 결과가 시간의 흐름에 따라 계속해서 다르게 출력되는 식으로 이용한다. 이와 같은 방법으로 우리가 흔히 생각하는 의미(실행 할 때마다 값이 다르게 나오는)의 난수를 구현한다.
|
|
|
|
|
|
6. 람다식의 변수 스코프는?
|
|
|
7. IEnumerable<T> 변수를 foreach 키워드로 순회하도록 변경 바랍니다.
|
|
|
8. Where().FirstOrDefault() 하지 말고 곧장 FirstOrDefault() 할 수 없나요?
|
... | ... | |