이 예제에서는 스레드가 어떻게 흐르고 있는지 궁금합니다. 비동기 이벤트 핸들러가 있으며 다른 비동기 메소드를 호출합니다.이 메소드에는 두 가지 대기가 있습니다. 이 같은 흐름을 이해할 수있다 :멀티 레이어 비동기 제어 흐름
이- 1) UI 스레드를 Button1_Click를 호출이 순차적으로 LoadStringAsync 메소드를 호출을
- 2) LoadStringAsync가 GetFirstNameAsync 처음
- 3) GetFirstNameAsync가 기다리고이 완료되지 않은 작업, LoadStringAsync 반환 호출 작업
- 4) LoadStringAsync 차례를 Button1_Click 는 UI 스레드를 Button1_Click 잎 LoadStringAsync
- 5)에 의해 반환되는 작업을 기다립니다, 완료되지 않은 작업을 반환합니다. 이것이 UI 스레드가 을 차단하지 않는 이유입니다.
- 6) GetFirstNameAsync가 결국 완료되면 LoadStringAsync는 으로 계속 진행될 수 있습니다. 즉 UI 스레드가 다시 들어올 것이며 다음 번에 또 다른 행인 이 실행될 것입니다.
- 8) GetLastNameAsync가 완료되지 않은 작업이 LoadStringAsync 이
- 9 GetLastNameAsync 에 의해 반환 된 작업)를 Button1_Click는 UI 스레드가 다시를 Button1_Click 잎 LoadStringAsync
- 10)에 의해 반환되는 작업을 기다리고 기다리고 반환하고 다른 작업을 수행.
- 11) 동일한 단계가 반복됩니다.
제 가정은 맞습니까? 또는 여기에 교착 상태가 있습니다.
private async void button1_Click(object sender, RoutedEventArgs e)
{
string s = await LoadStringAsync();
textBox1.Text = s;
}
static async Task<string> LoadStringAsync()
{
string firstName = await GetFirstNameAsync();
string lastName = await GetLastNameAsync();
return firstName + ” ” + lastName;
}
설명하신 흐름이 적절하다고 생각됩니다. LoadStringAsync, GetFirstNameAsync 등과 같은 세부 사항을 제공하지 않았기 때문에 여기서 교착 상태가 발생하지 않는지 확실히 말할 수는 없습니다. 거기에 차단 호출이 없으면 정상이어야합니다. –
자세한 내용은 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx를 참조하십시오. –