비동기 / 대기 대 스레드


100

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

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

2
스레드 및 Async / Await는 관련없는 기능입니다. 그것들을 결합 할 수는 있지만 그럴 필요는 없습니다.
dtb

2
나는 Async / Await가하는 것과 똑같은 일을한다고 생각했습니다 new Thread(() => {Some Work}).Start();.?! 그렇지 않습니까?
Roman Ratskey

2
아니. 귀하의 가정이 올바르지 않습니다. Async / Await 와 자주 결합되지만 관련이없고 함께 사용할 필요가없는 Task.Run (TPL)을 생각할 수 있습니다 .
dtb

4
@dtb : 그래서 언제 Async / Await를 사용하고 언제 쓰레드를 사용할 것인가?. Task.Run, Thread.Start, Async / Await의 차이점에 대해 정말 혼란 스럽습니다. 당신이 날 그들 사이의 차이점을 이해하게 좋은 설명 날을 제공 할 수 있다면 나는 것 매우 thankfull
로마 Ratskey

2
Async / await는 스레드를 생성하거나 다른 방식으로 사용하지 않습니다.
wRAR

답변:


78

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

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

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

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

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

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


4
최신 C # 측면에서 외부 API에서 비동기 콜백을 달성하는 가장 좋은 방법은 무엇입니까?
bonCodigo

5
마지막 단락에서 다룬 태스크를 사용하십시오.
Hans Passant 2015

예를 들어 비동기 프로그래밍을 통해 수행 할 수없는 스레드가 수행 할 수있는 작업을 기대합니다.
사이드 Neamati

1
"스레드는 더 많은 유용한 일을 할 수 있습니다."로 확장 할 수 있습니까? 스레드가 제공하는 async부적합한 기능을 이해하는 것이 유용 할 것 입니다.
Benjohn 2011

1
await Task.RunCPU 바운드 작업에 대해 언급 할 가치가 있습니다. 내가 올바르게 이해하면 때로는 스레드 또는 백그라운드 작업자를 만들 때 수행 할 작업을 수행합니다.
ToolmakerSteve

15

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


이것은 명확하고 간결한 Threads 및 Async / Await에 대해 읽은 첫 번째 리소스와 같습니다.
Arman Bimatov 2015 년

2
이 답변에는 문서에 대한 링크 만 포함되어 있습니다. 링크가 구식이 될 수 있으므로 답변도 구식이 될 수도 있고 더 나쁠 수도 있습니다. 대신 Stack 사용자가 링크의 관련 부분을 질문에 직접 게시하도록 권장합니다.
HimBromBeere

1
안타깝게도 공식 성명은해야 할 때를 설명하지 않습니다 await Task.Run. Task.Run에 대한 간략한 언급이 있지만 명확하지 않습니다. 결론은 그 await자체로는 CPU 바운드 작업을 병렬로 실행하지 않으므로 이러한 작업은 await Task.Run.
ToolmakerSteve

1

저는 이런 식으로 생각합니다 ( 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 스레드가 멈출 수 있으므로 파일 다운로드 스레드를 만들어 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.