선생님 오늘 마지막 질문이 될 것 같습니다!
namespace Temp
{
class Program
{
private static async void SimpleTest()
{
int sum = 0;
for (int index = 1; index < 4; index++)
{
Console.WriteLine("Code Block ##{0}", index);
sum += await ServerCallAsync();
}
Console.WriteLine("Result : {0}", sum);
}
public static Task<int> ServerCallAsync()
{
return Task<int>.Run(() =>
{
return 5;
});
}
static void Main(string[] args)
{
SimpleTest();
Console.ReadLine();
}
}
}
Main Thread는 Code Block ##1 출력 후 SimpleTest() 메서드를 빠져나간다.
ServerCallAsync 메서드 내부 : 스레드 풀에서 새로운 스레드 3번을 꺼내서 5를 반환한다.
await 아래 문장들 실행 : 스레드 풀에서 새로운 스레드 4번을 꺼내서 아래 3문장을 실행한다.
sum = sum + 5;
index++; (i = 2)
Code Block ##2 출력
ServerCallAsync 메서드 내부 : 스레드 풀에서 스레드 5번을 꺼내서 5를 반환한다.
await 아래 문장들 실행 : 스레드 풀에서 새로운 스레드 6번을 꺼내서 아래 3문장을 실행한다.
sum = sum + 5;
index++; (i = 3)
Code Block ##3 출력
ServerCallAsync 메서드 내부 : 스레드 풀에서 새로운 스레드 7번을 5를 반환한다.
await 아래 문장들 실행 : 스레드 풀에서 새로운 스레드 8번을 꺼내서 아래 2문장을 실행한다.
sum = sum + 5;
Result : 15 출력
[질문 ①]
스레드 풀에 요청을 6번하는 코드 흐름이 맞나요?
정확한 이해를 위해서 스레드 풀에 호출할 때마다 매번 다른 스레드가 호출된다고 가정했습니다.
[질문 ②]
현재 제가 사용하는 컴퓨터는 코어가 2개입니다.
그래서 실제로 위에 코드를 실행시키면 스레드 3번, 4번 오직 2개만 생성해서 처리하더라구요.
이것은 CPU 코어 수만큼 Working 스레드를 만드는 것이
context switching 비용을 최소화하기 때문에
2개의 Working 스레드만 사용했다고 생각해도 되나요?
[최초 등록일: ]
[최종 수정일: 5/10/2022]