[c#] 비동기 / 대기 대 스레드

.Net 4.5에서 Microsoft는 Async/Await비동기 코딩을 단순화 하는 새로운 기능을 추가했습니다 . 그러나 나는 궁금해

  1. Async/Await이전 사용 방식을 완전히 대체
    할 수 있습니까 Threads?
  2. Async/AwaitA가 어떤 일을 할 수있는 Thread비동기 적으로 할 수 있습니까?
  3. 주 스레드를 차단하지 않고 사용하도록 동기식 메서드를 변환하거나 Async/Await같은 일부 메서드에서만 사용할 수 있습니까 ?WebClient.DownloadStringAsyncAsync/Await


답변

쓰레드를 사용하던 예전 방식을 완전히 대체 할 수 있습니까?

아니요. 스레드는 더 많은 유용한 작업을 수행 할 수 있습니다. 기다리고 있습니다 특별히 처리하도록 설계되었습니다 무언가가 가장 일반적으로 I / O 요청을 시간을내어. 전통적으로 I / O 요청이 완료되었을 때 콜백으로 수행되었습니다. 이러한 콜백에 의존하는 코드를 작성하는 것은 매우 어렵습니다. await는 매우 간단합니다.

스레드가 비동기 적으로 할 수있는 일을 할 수 있습니까?

대충. Await는 지연을 처리하기 만하면됩니다. 그렇지 않으면 스레드가 수행하는 작업을 수행하지 않습니다. await 키워드 오른쪽에있는 await 표현식 은 작업을 완료하는 것입니다. 이상적으로는 스레드를 전혀 사용하지 않고 드라이버 요청을 게시하고 드라이버가 데이터 전송을 완료하면 완료 알림 콜백을 생성합니다. 네트워킹은 가장 일반적인 용도이며 수백 밀리 초의 지연 시간이 일반적이며 데스크톱 또는 LAN에서 “클라우드”로 이동하는 서비스의 불가피한 부작용입니다. 이러한 서비스를 동 기적으로 사용하면 UI가 매우 응답하지 않게됩니다.

WebClient.DownloadStringAsync와 같은 일부 메서드에서만 사용할 수 있습니다.

아니요. Task를 반환하는 모든 메서드와 함께 사용할 수 있습니다. XxxxAsync () 메서드는 시간이 걸리는 일반적인 작업을 위해 .NET 프레임 워크에서 미리 조리 된 것입니다. 웹 서버에서 데이터를 다운로드하는 것과 같습니다.


답변

이것에 대한 공식 성명. 한 가지를 맹목적으로 다른 것으로 바꾸기 전에 스레드와 비동기 프로그래밍의 차이점을 이해해야합니다.


답변

저는 이런 식으로 생각합니다 ( https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110) 를 보면 Microsoft도 마찬가지라고 생각합니다. ) # 스레드 )

Async / await는 메인 애플리케이션 스레드에서 일부 코드를 실행하는 빠른 방법입니다. 코드가 수행 할 작업이 없을 때 자체적으로 일시 중단되고 메인 스레드로 포커스를 되돌리고, 메인 스레드에서 “wake up”할 수 있다는 이점이 있습니다. 결과를 얻은 다음 처리를 다시 주 스레드로 전달합니다. 특정 실행 라인으로 제어를 앞뒤로 전달할 수있는 Basic의 이벤트 기반 GOTO 문이라고 생각하면됩니다.

반대로 스레드는 자체 변수 등으로 실행할 수있는 별도의 실행 스트림입니다. 충분한 하드웨어가 주어지면 실행이 메인 스레드와 병렬로 발생합니다.

단일 파일을 다운로드 한 다음 다운로드 할 때 해당 파일로 작업을 수행하는 GUI 응용 프로그램이있는 경우 async / await 메서드를 사용하여 구현합니다.

그러나 GUI에서 5000 개의 파일을 다운로드해야하는 경우 파일 다운로드를 처리하기 위해 실행이 전송되는 동안 기본 GUI 스레드가 멈출 수 있으므로 파일 다운로드 스레드를 만들어 처리합니다.


답변