2017-12-08 17 views
0

Task에서 오랫동안 실행하는 async 메서드입니다..NET과 관련하여 작업이 끝날 때까지 기다리는 가장 좋은 방법은 무엇입니까?

public async Task<int> LongRunningMethod(T p1, T p2, T p3); 

우리 팀의 일부 개발자들은 일부 사용하는 동안

await LongRunningMethod(p1,p2,p3); 
// Here too, we simply 'await' till the method finishes. 

참고

Task t = Task.Factory.StartNew(LongRunningMethod(p1,p2,p3)); 
t.Wait(); //This will suspend main thread and wait for 't' to finish. 

를 사용 : 우리는 비동기 작업을 가지고 있고 우리는 그 작업이 완료됩니다 때까지 기다려야합니다.

요약하면 위의 두 구문 중 어느 것이 가장 좋습니까?

+0

"최고"를 정의하십시오. –

+2

왜 비동기식으로 기다리지 않습니까? * 기다리고 *) 작업을 완료하려면? 또한 Task.Factory.StartNew를 사용하면 중첩 된 작업 문제 (예 : 여기서 'Task '또는 'Task ')를 실행하기 때문에이 경우 정확하지 않을 수 있습니다. Task.Run을 선호하십시오 (예 : StartNew에서 이미 작동하는 기존 레거시 코드). –

+0

그건'Thread'가 아니라'Task'입니다. 그리고 아니, 그들은 반드시 똑같은 것은 아닙니다. 차이점은 [here] (https://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread)와 [여기] (https://stackoverflow.com/)를 참조하십시오. 질문/37419572/if-async-await-doesnt-create-any-additional-threads-then-how-make-it-appl). – john

답변

2

는 위의 두 가지 구조 중 가장 어느 하나? 시스템 확장 성 그림에 관해서

당신은 영향을 알 수, Task.Wait()await Task 사이의 차이점은 호출/실행 스레드를 치료하는 방법입니다. 완료 될 때까지 첫 번째 블록이 차단 될 때 await을 사용하는 다른 호출자는 호출자를 확보 할 수 있지만 IO 호출, 네트워크 호출, 메모리 논리 처리에 있지 않은 데이터베이스 호출을 의미하는 True 비동기 호출에만주의해야합니다 , 호출 스레드 또는 컨텍스트가 해제 될 때 비동기 API를 노출합니다. 실제 비동기 호출의 경우 Windows에서 IO 완료 포트 (큐 메커니즘)를 사용하여 비동기 파이프 라인을 실행합니다.

호출 체인의 마지막 메소드가 비동기가 아닌 경우에는 이러한 일이 발생하지 않습니다. 모두 계속, 게시 완료를 실행하지만 다음의 예제를 보자 것이기

그들은, Waitawait

실제로 거의 비슷 일반적으로 스레드가 직접 시스템에 코어의 수에 연결되어 처리하기 TPL을 사용하면 이러한 스레드는 풀에서 호출되며 사용할 수있는 스레드 수에는 제한이 있습니다. 100K/초 요청과 같은 확장 성이 뛰어난 시스템의 경우 스레드가 대기 중으로 작동 중이거나 차단되어 새로운 요청을받지는 않지만 장시간 실행중인 메서드의 경우 Task.Wait()가 매우 빨리 시간 초과됩니다. 전혀 발생하지 않습니다.

실제 예

  • 자바 스크립트, NodeJs 항상 기본적으로 비동기 요청을 이동 시스템은 확장 성이 뛰어난 이유 이유는 전혀 차단이

  • 또한 함께, ConfigureAwait(false)을 고려하지 기다리면, 같은 스레드 컨텍스트가 실행을 계속하기 위해 다시 입력 할 필요가 없습니다. 훨씬 더 효율적입니다.

2

작업을 사용하는 지점은 동일한 컨텍스트에서 일부 작업을 병렬로 실행하는 것입니다. 컨텍스트에서 장기 실행 작업을 시작하고 작업이 완료 될 때까지 기다리기를 원할 경우 표시되는 두 가지 방법 모두 동일한 방식으로 작동합니다.

하지만 장기 실행 작업을 실행하는 동안 다른 작업을 수행하려는 경우, 당신은

Task taskObj = LongRunningMethod(); 
/// Do some other operations here... 
var result = await taskObj; 

로 할 수있다 그러나 장기 실행 작업에서 결과를 필요로하는 경우 당신이해야 할 몇 가지 작업을 할 작업이 완료 될 때까지 기다려야합니다. 또는 사용할 수 Task.ContinueWith() 한마디로

+1

'await'이 소개되면서 'ContinueWith'에 대한 사용 사례가 표시되지 않습니다. ', Pre'await' 설정에서 인기가 있었지만 Task.Wait과 같은 제한이 있습니다 –