이 우연히 포스트 비동기 웹 요청을에 대해 이야기하는.
현실 세계에서 비동기 요청을하고 바로 다음 줄에서 대기하는 것이라면 간단합니다. 처음에 동기화 호출을하는 것과 동일하지 않습니까?
이 우연히 포스트 비동기 웹 요청을에 대해 이야기하는.
현실 세계에서 비동기 요청을하고 바로 다음 줄에서 대기하는 것이라면 간단합니다. 처음에 동기화 호출을하는 것과 동일하지 않습니까?
답변:
아니, async + await != sync
때문에의 계속
MSDN에서 'Async and Await를 사용한 비동기 프로그래밍 (C # 및 Visual Basic)'
비동기 메서드는 비 차단 작업입니다. 비동기 메서드의 대기 식은 대기중인 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다. 대신, 표현식 은 나머지 메소드를 연속으로 등록하고 async 메소드의 호출자에게 제어를 리턴합니다 .
예를 들어 비동기 실행은 UI 스레드를 차단하지 않으며 Some TextBox.Text
다운로드가 완료된 후에 업데이트됩니다.
private async void OnButtonClick()
{
SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}
Console.WriteLine(await GetStringOverNetwork());
? 비동기 호출의 출력이 필요한 경우 어떻게합니까? 스레드가 잠재적으로 실행을 계속할 수 있어도 프로그램이 처음 액세스 할 때 차단됩니까?
아니요, 동일하지 않습니다.
귀하의 async
코드 블록은 기다리고 있습니다 await
,하지만 응용 프로그램의 나머지 부분은 대기하지 않습니다 계속 반환에 전화 여전히 정상처럼 계속할 수 있습니다.
반대로, 동기 호출은 전체 애플리케이션 또는 스레드가 코드 실행이 완료 될 때까지 기다렸다가 다른 작업을 계속하도록합니다.
나는 같은 질문을 염두에두고이 문제를 우연히 발견했지만, 응답을 읽은 후에는 "매력적인 마술"에 대한 언급으로 혼란스러워 보인다.
위에서 언급 한 비동기 프로그래밍에서 :
async
키워드는 당신이 사용할 수있는 비동기 방법으로하는 방법집니다await
몸에 키워드를.- 때
await
키워드가 적용되어, 그것은 호출 방법을 일시 중단하고 기다려온 작업이 완료 될 때까지 수익률은 호출자에게 제어 할 수 있습니다.await
async
메소드 안에서만 사용할 수 있습니다 .
발생하는 컨텍스트가 await
차단됩니까?
나머지 응용 프로그램은 await
?
신청서 작성 방법에 따라 다릅니다 . await
동일한 컨텍스트에서 순차적으로 실행 되는 일련의 종속 ed 작업 인 경우 ( 일부 비동기 / 대기 동작 이해 시도 )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
이런 식으로 각각 await
다음 스폰 생성을 차단합니다.
반면에 병렬로 시작된 동일한 종속 작업은 병렬로 실행되며 컨텍스트는 resp에서만 차단됩니다. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
일반적으로 await
현재 컨텍스트가 호출되는 외부 컨텍스트에 대한 실행 수율. 그러나 외부 컨텍스트 자체가 현재를 기다리는 await
경우 동일한 컨텍스트 의 순차적 인 것과 같습니다.
따라서 async
이점 을 얻으려면 여러 병렬 컨텍스트 (UI, 데이터 클라이언트 등)를 실행하도록 응용 프로그램을 디자인 한 다음 await
한 컨텍스트에서 다른 컨텍스트를 실행하여 전체 응용 프로그램이 개인을 차단하지 않도록해야합니다 await
.