2017-12-11 6 views
0

내 Task.Result를 호출하여 결과를 기다리는 데 ContinueWith()를 사용하는 다음 코드를 발견했습니다.기다려온 작업에 ContinueWith()를 사용하고

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync() 
     .ContinueWith(task => 
     { 
      return task.Result; 
     }); 
} 

ContinueWith()GetUserAsync() 통화에서 작업 반환 될 때까지 호출 스레드를 차단합니까?

task.Result이 예약 된 ContinueWith() 안에 있기 때문에 전주를 기다리는 동안 차단되는 것이 있습니까? task?

다른 유형의 코드에서이 유형의 코드를 보았습니다. 이것이 비동기/대기 패턴의 모범 사례로 간주됩니까? GetUserAsync() 호출은 ContinueWith()을 사용하는 것보다 결과를 반환 할 것으로 기대합니다.

+2

대기중인'작업'에'ContinueWith'를 사용하고 있지 않습니다. 'ContinueWith'에 의해 생성 된 연속'작업'을 기다리고 있습니다. BTW, 왜 공용 작업을 사용하지 마십시오 GetUser() => _serviceRepo.GetUserAsync(); ' – PetSerAl

+0

이렇게 할 이유가 없습니다. 비동기, 대기 및 계속 대기를 완전히 제거 할 수 있습니다. – Evk

답변

1

ContinueWith()은 작업이 GetUserAsync() 호출에서 반환 될 때까지 호출 스레드를 차단합니까?

아니요, 스레드가 차단되지 않습니다. 이것은 async 작업입니다. 주어진 코드가 작업을 기다리지 만, 계속을 디버깅하는 동안 오해 할 수 있음을 명심하십시오. task.Result이 예약 된 ContinueWith() 내부이기 때문에 선행 작업을 기다리는 동안

, 아무것도 차단되고?

아니요, 작업이 이미 완료되어 현재 스레드가 차단되지 않습니다. 그러나 태스크가 실패한 경우 예외가 발생합니다.

이것은 asyn/await 패턴의 모범 사례로 간주됩니까?

아니,이 코드 형태로 쓸 수있다 :

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync(); 
} 

그러나, 계속 몇 가지 논리가있는 경우, 다음과 같이 :

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync() 
     .ContinueWith(task => 
     { 
      // do something with the result, for example, log the success 

      return task.Result; 
     }); 

당신은이 작업을 수행 할 수 있습니다

public async Task<User> GetUser() 
{ 
    var user = await _serviceRepo.GetUserAsync(); 

    // do something with the result, for example, log the success 

    return user; 
} 
+0

downvote하는 이유는 무엇입니까? – VMAtm

관련 문제