2016-12-07 5 views
0

C# TAP 코딩을 연구하기 시작했습니다. 코드는 동 기적으로작업 기반 비동기 패턴 이해 C#

async private void timer1_Tick(object sender, EventArgs e) 
    { 
     SyncCount++; 
     result1.Text = SyncCount.ToString(); 

     AsyncCount = await CountForALongTimeAsync(AsyncCount); 
     result2.Text = AsyncCount.ToString(); 
    } 

    async Task<int> CountForALongTimeAsync(int counter) 
    { 
     Thread.Sleep(3000); 
     counter++; 
     return counter; 
    } 
+6

변경'Thread.Sleep'는 Task.Delay'을 기다리고 있습니다. – Sinatr

+0

동기식 또는 비동기식을 어떻게 알 수 있습니까? 나는 (값으로 전달 된) 매개 변수를 반환하는 비동기 함수가 하나씩 증가하는 것을 봅니다 ... –

+2

'CountForALongTimeAsync' 메서드에'await' 표현식이 없다는 경고 메시지가 이미 나타 났으므로 동 기적으로 실행됩니다. 비동기 작동 방식에 대한 자습서를 읽어야 할 수도 있습니다 ... 비동기 한정자를 추가하면 모든 것이 비동기가됩니다. 합리적으로 철저히 이해할 가치가 있습니다. –

답변

4
실제로 일부 대기 (가 주어진 호출을 모두 가질 수있는 가능성을 수행하는 최초의 await 에드 비동기 호출 될 때까지 실행됩니다 다음에 오는 어떤
async Task<int> CountForALongTimeAsync(int counter) 
{ 

실행되는 이유를 이해하지 않는 것이 즉각적으로 반환해야합니다 (예 : 인터넷에 연결되거나 캐시에서 데이터를 반환 할 수있는 서비스, 즉 대기하지 않는 서비스).

ed 호출이 전혀 없으므로 Task이 이미 반환되었습니다.

이미 완료된 작업은 await CountForALongTimeAsyncawait이므로 동기식으로 실행됩니다.

방법은 것보다 같은 : 덧붙여

async Task<int> CountForALongTimeAsync(int counter) 
{ 
    await Task.Delay(3000); 
    counter++; 
    return counter; 
} 

,했을 것이다 아주 (하지만 완전히) 비슷한 일을 사전 await 방법 :

Task<int> CountForALongTimeAsync(int counter) 
{ 
    return Task.Delay(3000).ContinueWith(t => 
    { 
     ++counter; 
     return counter; 
    }); 
} 

이 다른 것을 고려를 과제 후 "계속되는"아이디어는 약간의 통찰력을 줄 수도 있고 아닐 수도 있습니다. 반면

질문의 코드가되었다 않는 일을 가장 가까운 미리 기다리고 방법 :`에

Task<int> CountForALongTimeAsync(int counter) 
{ 
    Thread.Sleep(3000); 
    counter++; 
    return Task.FromResult(counter); //FromResult returns an already completed task. 
} 
관련 문제