표현

2012-09-19 5 views
5

나는 MSDN에 await 자습서를 따라하고있어 대 문을 기다리고, 그리고 나는 표현await를 사용하여 대 await를 사용 사이의 차이를 알아 내려고 노력하고있어. 이 전체 비동기식 기다림은 내 마음을 굽히는 것이므로이 특별한 경우에 대한 예제를 찾을 수 없습니다.표현

기본적으로 여러 개의 await을 비동기 적으로 사용하는 방법을 알고 싶었습니다. 즉, 두 번째 것이 시작되기 전에 완료 할 때까지 기다릴 필요가 없다는 것을 의미합니다. 그것은 단지 내가 원하는 것 무엇을 표시 할 수있는 두 개의 "완료"의, 총 3 초 소요 미묘한 변화,

private async void button1_Click(object sender, EventArgs e) 
{ 
    // Using await as an expression 
    string result_a = await WaitAsynchronouslyAsync(); 
    string result_b = await WaitAsynchronouslyAsync(); 

    // This takes six seconds to appear 
    textBox1.Text = result_a + Environment.NewLine; 
    textBox1.Text += result_b; 
} 

public async Task<string> WaitAsynchronouslyAsync() 
{ 
    await Task.Delay(3000); 
    return "Finished"; 
} 

그러나이 나에게로 시작하는 비동기의 목적을 패배 - 두 await의 진정한 비동기 적으로 실행 :

private async void button1_Click(object sender, EventArgs e) 
{ 
    var a = WaitAsynchronouslyAsync(); 
    var b = WaitAsynchronouslyAsync(); 

    // Using await as a statement 
    await a; 
    await b; 

    // This takes three seconds to appear 
    textBox1.Text = a.Result + Environment.NewLine; 
    textBox1.Text += b.Result; 
} 

내 질문은, 왜이 다르게 행동합니까? 여기에 미묘한 점이 있습니까?

답변

11

우선 병렬 처리비동기식을 구별해야합니다. 첫 번째 경우 UI 스레드 등을 자유롭게하기 위해 작업을 동 기적으로 수행 할 가치가 있습니다 (실제로 두 번째 작업은 첫 번째 결과에 따라 다를 수 있음).

다르게 - await 표현입니다. 이는 문으로 나타날 수있는 표현식이지만 문자열을 반환하지만 반환 값은 무시하는 메서드를 호출하는 것과 같은 방식으로 작동합니다. 첫 번째 코드를 다음과 같이 변경하면 확인할 수 있습니다.

// Still takes 6 seconds... 
var a = WaitAsynchronouslyAsync(); 
await a; 

var b = WaitAsynchronouslyAsync(); 
await b; 

여전히 6 초가 걸립니다. 요점은 첫 번째 비동기 작업이 완료 될 때까지 기다렸다가 두 번째 비동기 작업 만 시작한다는 것입니다. 두 번째 예제에서는 두 비동기 작업이 동시에 발생합니다.

당신은 여전히 ​​이 변수에 값을 할당하는 것이, 방금 awaitables 기억해야 할 수

: 그러니까 기본적으로

// This will only take 3 seconds 
var a = WaitAsynchronouslyAsync(); 
var b = WaitAsynchronouslyAsync(); 
string result_a = await a; 
string result_b = await b; 

를, 차이는 문/표현과 함께 할 수 없습니다 - 그건 시퀀스가 start/await/start/await인지 또는 start/start/await/await인지 여부를 결정합니다.

+0

귀하의 마지막 편집이 나를 깨닫게 감사를 표시 - 시퀀싱이 문제입니다. 나는 그들이 둘 다 표현이라는 것을 깨달았어야했다. –

4

두 경우 모두 await 키워드는 비동기를 도입합니다. 차이점을 보는 이유는 사례 1에서 두 가지 작업을 순차적으로 시작하기 때문입니다. 사례 2에서 두 가지 작업을 동시에 실행할 수 있습니다.

  • 작업 A를 시작 (A) 작업이 기다리고있다
    • (제어 :

      아마 두 경우 모두의 단계를 설명하여 단계는 여기에서 발생하는 것은

      string result_a = await WaitAsynchronouslyAsync(); 
      string result_b = await WaitAsynchronouslyAsync(); 
      

      까지 일을 지 웁니다 호출자에게 반환됩니다.

    • 작업 a가 3 초 후에 완료되면 메서드가 다시 시작됩니다.

      : 태스크 (b)는
    • 태스크 B는 태스크 B가 3 개의 다른 초 후에 끝나면
    • 는 텍스트 번째 경우

    나타난다 (제어는 호출자에게 리턴) 기다린다 시작될

    var a = WaitAsynchronouslyAsync();  
    var b = WaitAsynchronouslyAsync();  
    await a;  
    await b;  
    
    • 작업 (A)는 시작
    • 작업 (b)는 시작
    • 작업 (A) 아 '입니다 (b)가 약 3 초 전에 시작 되었기 때문에 작업 (b)가
    • 일 때 3 초 후 작업 (a)가 완료되면 더 많은 또는 더 적은 작업이 완료됩니다.
    • (a)는
    • 과 동시에 텍스트,