.net

[C#] Task.Wait()가 deadlock 걸리는 경우

toyship 2018. 12. 24. 22:10
반응형
원작자
https://social.msdn.microsoft.com/Forums/vstudio/en-US/65a5f291-e4bf-4327-a4fa-b42b21add0e2/how-there-can-be-deadlock-in-taskwait?forum=csharpgeneral
public partial class Form1 : Form
{
    public Form1 ()
    {
        InitializeComponent();
    }
    private void button1_Click ( object sender, EventArgs e )
    {
        var task = DoWorkAsync();
        task.Wait();
    }
    private async Task DoWorkAsync ()
    {
        //Running on UI thread 
        //Will return from method and run remainder on secondary thread
        await Task.Delay(1000);
        //Didn't use ConfigureAwait so back on UI thread but UI thread is blocked
        //wait for the task to complete - deadlock
        await Task.Delay(2000);
    }
}



위예를 보면, DeadLock이 걸린다.

왜 걸리는지 보면,  


첫번째 await를 만나는 순간  DoWorkAsync() 함수를 벗어나게되고,

button1_click() 함수에서

task.Wait()에 메인 UI 쓰레드가 lock이 걸리게 된다.


첫번째 await의 Delay 가 끝나고 다음 줄로 실행을 옮겨야 하는데

이걸 실행하는 것이 메인 UI 쓰레드 인데,  아까 말했듯이

메인 UI 쓰레드는 DoWorkAsync가 끝나기를 기다리고 있다.


맞다, 서로 어쩌지 못하는 DeadLock 상태다.


여러가지 솔루션이 있는데, 아래걸 써보자.


// await가 꼬여있는경우, 잘 사용하자.

ConfigureAwait(false)



반응형

'.net' 카테고리의 다른 글

c#에서 c++ dll 디버깅하기.  (0) 2017.01.25
.net reference dll 버전확인.  (0) 2014.10.07
c# 자동으로 using 알아내기.  (0) 2014.09.30
.NET SmartClient 설치시 유의점  (0) 2010.10.02