만약 내가 task
하지 않고 async await
, 내 의지 task
비동기 또는 동기 고려? 에서 마이크로 소프트의 문서 , 그것은라고 The tasks run asynchronously and may complete in any order.
하지만, 하나 개의 유래 포스트 , 그것은 말한다Wait will synchronously block until the task completes. So the current thread is literally blocked waiting for the task to complete.
작업이 비동기 또는 비동기 대기없이 동기입니까?
그것은 전적으로Task
그 자체 에 달려 있으며 사용 여부와 관련 이 await
없습니다.
를 사용 Task.Run()
하여 새 작업을 만들면 작업자를 스레드 풀에 대기시키고 비동기 적으로 실행 됩니다. 그러나 메서드 Task
에서 객체를 가져올 수도 있습니다.이 Task.FromResult()
메서드는 완료된 작업을 동 기적으로 반환 합니다 .
이 두 극단 사이에는 async
때로는 동기식으로 완료되고 때로는 완료되지 않는 메서드 (예 : 파일 또는 네트워크에서 데이터 읽기, 때로는 데이터가 이미 버퍼링되어 사용 가능하고 다른 경우에는 나중에까지 사용할 수없는 경우) 와 같은 것들이 있습니다.
스택 오버플로는 당신이 언급 게시 작업의 비동기 자연과 아무 상관이없는,하지만 당신은 방법에 따라 오히려 무슨 일 대기 완료 될 때까지 작업. 물론 동기식으로 완료된 작업 개체는 개체에 대한 참조가있을 때 이미 완료되었으므로 이러한 개체에 대해 "대기"하면 실제로 아무것도 차단하지 않습니다. 따라서 흥미로운 경우는 아직 완료되지 않은 작업 객체입니다. 즉, 비동기 적으로 완료 될 것입니다.
이 경우 Wait()
메서드는 현재 스레드를 차단합니다. 이는 의도적으로 설계된 것이며 명확하게 문서화되어 있습니다. 이것은 거의 당신이 원하는 것이 아닙니다. 그러나를 사용하더라도 Wait()
작업 자체는 여전히 비동기 적이라는 점에 유의하는 것이 중요합니다 . 현재 스레드를 차단했을 수 있지만 작업이 나타내는 모든 것을 포함하여 프로세스에서 여전히 다른 일이 발생합니다. 이러한 일은 현재 스레드에서 비동기 적으로 발생합니다.
현재 스레드가 아무 작업도하지 않도록 선택했다는 사실은 시작한 작업의 본질적으로 비동기 특성을 변경하지 않습니다.
보다 일반적으로 await
작업이 완료되면 현재 동기화 컨텍스트에서 나중에 현재 메서드가 다시 실행되도록 요청을 효과적으로 등록하는 데 사용 합니다. 상기 await
문, 현재의 방법은 다른 일을 계속 할 수 있도록 호출자에게 스레드 등을 얻을 것입니다. 이 경우 작업은 Wait()
스레드를 사용 하고 차단 한 것처럼 여전히 비동기 적으로 완료 되지만 현재 스레드는 다른 작업을 수행 할 기회도 갖게됩니다.
두 경우 모두 작업 자체는 여전히 비동기 적입니다. 당신이 그것을 기다린 방식은 그것에 아무런 영향을 미치지 않습니다.
IMHO, 작업이 비동기인지 여부에 대해 걱정하는 것은 의미가 없습니다. 코드는 상관없이 동일하게 작동해야합니다. 대신 작업을 미래의 어느 시점에 결과를 제공하겠다는 "약속"으로 간주하십시오. 실제로 "약속"과 "미래"라는 단어는 다른 프로그래밍 환경에서 "작업"대신 동일한 것을 나타내는 데 자주 사용됩니다. 때로는 그 약속이 즉시 성취되고 때로는 시간이 걸리지 만 어떤 일이 발생하는지는 실제로 중요하지 않습니다. 중요한 것은 약속 자체가 아니라 약속이 언제 어떻게 유지 될 것인지가 아닙니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다