2014-05-09 2 views
10

내가 비동기없는 방법을 가지고 있지만 반환 가정 해 보자 Task반환 유형으로 Task를 사용하여 비동기 메서드에서 반환 할 대상은 무엇입니까?

public Task DoWorkAsync(Guid id) 
{ 
    // do the work 

    return ...; 
} 

반환하는 최선의 목적은 무엇인가 (정의가 비동기 구현을 또한 구성 인터페이스에서 있기 때문에)? 나의 현재 옵션 :

return Task.Yield(); 
return Task.FromResult<object>(null); 

// any of the other but cached in a static field and reused. 
+0

사이드 노트 - 이러한 경우에 가장 큰 문제 발신자이다 -는 가능하면 다음 –

+2

@SergeyBerezovskiy는 비동기 작업 (ISP 원칙을)하지 않는 별도의 인터페이스를 소개합니다 제공된 구현 (예 : IoC)에 따라 두 인터페이스를 전환해야합니다. 사이에 래퍼를 만들 수는 있지만 원래의 질문은 여전히 ​​중요합니다. –

답변

16

당신은 Task.Yield()을 반환 할 수 없습니다, 그렇지 않은 await과 함께 사용할 수있는 Task하지만 YieldAwaitable, 그리고 실제로 비동기 소개는 (좀 more details here을 기록했다).

나는이 목적으로 Task.FromResult(Type.Missing)을 사용합니다. 아마도 가장 효율적이지만 문서화되지 않은 옵션은 Task.Delay(0), it returns a static completed task입니다.

+1

나는 가독성을 위해 전자와 함께 갈 것이다. –

+0

@YuvalItzchakov, 나도. 또한'Task.Delay (0)'와는 달리 고유 한 작업을 반환합니다. 원한다면 캐시 할 수 있습니다. – Noseratio

+5

+1. 나는'Task.FromResult (null)'을 좋아하지만, .NET 팀은'Task.FromResult (0)'을 선호하는 경향이있다. 하지만 그 중 어느 것도 캐시되지 않습니다. –

관련 문제