... | @@ -426,6 +426,13 @@ else |
... | @@ -426,6 +426,13 @@ else |
|
|
|
|
|
1. await를 사용하면 항상 쓰레드가 자동으로 만들어지는가?
|
|
1. await를 사용하면 항상 쓰레드가 자동으로 만들어지는가?
|
|
|
|
|
|
|
|
await가 보장하는 것은, Task가 UI Thread에 돌던지, Worker thread에서 돌던지 상관없이 Task 완료 후 await 이후의 실행문들을 디폴트로 원래 await를 실행하기 전의 Thread에서 실행하도록 보장하는 것이다.
|
|
|
|
|
|
|
|
하지만 내가 실험하는 환경은 콘솔 어플리케이션이다. 콘솔 어플리케이션은 Thread pool SynchronizationContext를 가지기 때문에 await 이후의 부분이 thread pool thread에 스케쥴링된다. 그래서 [이곳](#비동기-호출) 코드를 보면 실행 전, 후의 ThreadId가 다르다. 이것 때문에 await가 스레드를 만드는 것으로 보였던 것이다.
|
|
|
|
|
|
|
|
[async/await 관련 글](http://egloos.zum.com/sweeper/v/3193944)
|
|
|
|
[SynchronizationContext 관련 글](http://mhchoi8423.tistory.com/18)
|
|
|
|
|
|
비동기 메서드는 비차단 작업입니다. 비동기 메서드의 await 식은 대기한 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다. 대신에 이 식은 메서드의 나머지를 연속으로 등록하고 제어 기능을 비동기 메서드 호출자에게 반환합니다.
|
|
비동기 메서드는 비차단 작업입니다. 비동기 메서드의 await 식은 대기한 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다. 대신에 이 식은 메서드의 나머지를 연속으로 등록하고 제어 기능을 비동기 메서드 호출자에게 반환합니다.
|
|
async 및 await 키워드로 인해 추가 스레드가 생성되지 않습니다. 비동기 메서드는 자체 스레드에서 실행되지 않으므로 다중 스레드가 필요하지 않습니다. 메서드는 현재 동기화 컨텍스트에서 실행되고 메서드가 활성화된 경우에만 스레드에서 시간을 사용합니다. Task.Run을 사용하여 CPU 바인딩 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 프로세스를 지원하지 않고 결과를 사용할 수 있을 때까지 기다립니다.(MSDN)
|
|
async 및 await 키워드로 인해 추가 스레드가 생성되지 않습니다. 비동기 메서드는 자체 스레드에서 실행되지 않으므로 다중 스레드가 필요하지 않습니다. 메서드는 현재 동기화 컨텍스트에서 실행되고 메서드가 활성화된 경우에만 스레드에서 시간을 사용합니다. Task.Run을 사용하여 CPU 바인딩 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 프로세스를 지원하지 않고 결과를 사용할 수 있을 때까지 기다립니다.(MSDN)
|
|
|
|
|
... | @@ -511,7 +518,7 @@ class MultiAwaitTest |
... | @@ -511,7 +518,7 @@ class MultiAwaitTest |
|
{
|
|
{
|
|
MultiAwaitTest test = new MultiAwaitTest();
|
|
MultiAwaitTest test = new MultiAwaitTest();
|
|
|
|
|
|
test.Run(); //첫번쨰 await를 만나면 다음으로 넘어간다.
|
|
test.Run(); //첫번째 await를 만나면 다음으로 넘어간다.
|
|
|
|
|
|
Console.WriteLine("test.Run() 다음 줄 실행"); //Do1과 Do2의 실행 속도에 따라서 결과가 달라진다.
|
|
Console.WriteLine("test.Run() 다음 줄 실행"); //Do1과 Do2의 실행 속도에 따라서 결과가 달라진다.
|
|
|
|
|
... | | ... | |