2013-07-01 5 views
21

나는 두 가지 방법의 차이점은 무엇입니까?C#의 비동기 한정자

async private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Thread.Sleep(2000); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     Thread.Sleep(2000); 
    } 

둘 다 내 UI를 차단합니다. 차단을 피하기 위해 다른 스레드를 시작해야한다는 것을 알고 있지만 발견했습니다 :

"비동기 메소드는 호출자의 스레드를 차단하지 않고 장기 실행 가능한 작업을 수행하는 편리한 방법을 제공합니다".

나는 약간 혼란 스럽다.

+3

비동기를 사용할 수 있지만 "대기"를 사용해야합니다 .. –

+8

컴파일러가'async' 메소드를 사용한다고 경고합니다. 읽어. 무엇이 잘못되었는지 알려줄 것입니다. –

답변

11

async 자체로 비동기 (비 차단) 메소드 호출을 사용할 수 없습니다.
함수 안에 await을 사용해야합니다.

이 기능을 더 잘 이해하려면 this을 읽어야합니다.

36

async을 추가하면 메서드 본문에 await 키워드를 사용할 수 있습니다. 제대로 구현 된 비동기 메서드는 UI 스레드를 차단하지 않지만 부적절하게 구현 된 비동기 메서드는 가장 확실한 방법입니다.

async private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    await Task.Delay(2000); 
    MessageBox.Show("All done!"); 
} 
1

1) 비동기 키 작업은 타임 슬라이싱에 의해, 아니 블로킹 메소드 asynchrounous한다 : 당신은 아마하고 싶어 무엇

이 있었다. 비동기는 대기 상태로 존재해야하며, 작업 완료를 기다리지 만 모든 물건이 실행됩니다.

async private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    var task = Task.Delay(1000); 

    /*Do stuff*/ 

    await task; 
} 

2) 스레드 잠자기 만하면 위의 모든 코드가 실행되지 않고 스레드 수면이 작업을 완료 한 후에 만 ​​실행됩니다.

private void Button_Click_2(object sender, RoutedEventArgs e) 
{ 
    Thread.Sleep(2000); 
    /*Do stuff*/ 
} 

Theres는 msdn에서 읽기 좋습니다 Asynchronous Programming with Async and Await!

+2

당신의 작업은 차단 대기를하고 있습니다. 이것은 불필요하게 스레드 풀의 시간을 소비합니다. 'Task.Delay'를 사용하면 비동기 오버 싱크 (async over sync)를 사용하지 않고 전체를 제대로 비동기로 만들 수 있습니다. – Servy

+0

이 코드는 유효하지 않습니다 ... –

+0

Thank you! =) 지금 당장! – Fals