버그 해결을 위한 모든 질문을 던져
0 votes
161 views

Task 공부중인데요 

아래 코드에서 왜 wait이 안되는지 이해가 잘 안되는데 이유가 뭔가요?

 

private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Application thread ID: {0}", Thread.CurrentThread.ManagedThreadId);
            
            var t = Task.Run(() => {
                PrintCount(5);
            });

            Console.WriteLine("넘어가나");

            t.Wait(); // <---- 왜 안기다리지?            

            Console.WriteLine("기다리나?");
        }

        static async void PrintCount(int count)
        {
            for (int i = 0; i < count; i++)
            {
                await Task.Delay(100 * new Random().Next(3, 10)); //0.3 ~ 1초 딜레이

                Console.WriteLine($"count {i} id:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
            }

            Console.WriteLine($"count end id:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
        }

 

출력 결과

넘어가나
기다리나?
count 0 id:4
count 1 id:3
count 2 id:4
count 3 id:3
count 4 id:3
count end id:3

 

asked (27 point) , 161 views

2 answers

0 votes
`PrintCount`가 또다른 비동기 `Task.Run`에 감싸져 있어요. (기둥 뒤 공간 어쩌구)
answered (81 point)
+1 vote
private void button1_Click()
{
	Console.WriteLine("Application thread ID: {0}", Thread.CurrentThread.ManagedThreadId);

	var task = Task.Run(()=>PrintCount(5));

	Console.WriteLine("pass?");

	task.Wait(); // <---- 왜 안기다리지?            

	Console.WriteLine("wait??");
	Console.ReadLine();
}

async Task PrintCount(int count)
{
	for (int i = 0; i < count; i++)
	{
		await Task.Delay(100 * new Random().Next(3, 10)); //0.3 ~ 1초 딜레이

		Console.WriteLine($"count {i} id:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
	}

	Console.WriteLine($"count end id:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
}

이건 기다립니다.

answered (51 point)
질문자에겐 위 코드가 더 정확한 답변이네요.

추가 참고: https://stackoverflow.com/a/50932089

으허엇 surprise ?!

위 링크에서 현 질문에 가장 주요한 내용을 한줄 뽑아봤습니다

The async void case is a "fire and forget": You start the task chain, but you don't care about when it's finished. When the function returns, all you know is that everything up to the first await has executed. 

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

520 질문
675 answers
665 댓글
118,176 users