13

비동기가 아닌 메소드가 있다고 가정하고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.


  • 사이드 노트 - 가능한 경우 비동기 작업이없는 별도의 인터페이스를 도입하십시오 (ISP 원칙) - Sergey Berezovskiy
  • @SergeyBerezovskiy - 이러한 경우의 가장 큰 문제점은 호출자가 제공된 구현 (예 : IoC)에 따라 두 인터페이스를 전환해야한다는 것입니다. 사이에 래퍼를 만들 수는 있지만 원래의 질문은 여전히 중요합니다. - Knaģis

2 답변


17

돌아올 수 없다.Task.Yield(), 그것은 아니에요.Task그러나YieldAwaitable와 함께 사용하기 위해await, 그리고 그것은 실제로 비동기를 도입합니다.자세한 내용은 여기에).

나는 사용한다Task.FromResult(Type.Missing)이 목적을 위해. 아마도, 가장 효율적이지만 문서화되지 않은 옵션은Task.Delay(0),정적 인 완료 작업을 반환합니다..


  • 나는 가독성을 위해 전자와 함께 갈 것이다. - Yuval Itzchakov
  • @YuvalItzchakov, 나도. 그것은 또한 독특한 작업을 반환합니다.Task.Delay(0). 원한다면 캐시 할 수 있습니다. - noseratio
  • +1. 나는 좋아한다.Task.FromResult<object>(null), .NET 팀은 선호하는 경향이 있습니다.Task.FromResult(0). 하지만 그 중 어느 것도 캐시되지 않습니다. - Stephen Cleary
  • 나는 서류 미비 된 선택권을 좋아한다. 나는 그것이 얼마나 안전하다고 생각 하는가?0x4000"처분하지 마십시오"는 항상 의미 할 것입니다. 따라서 생성 및 캐시new Task(false, (TaskCreationOptions)0x4000, System.Threading.CancellationToken.None)당신 자신... - Knaģis
  • @ Knaģis, 아마도 나쁜 생각 일 것입니다. 언제든지 변경할 수 있습니다. :) 또한이 생성자 재정의는 비공개이므로 리플렉션을 사용해야합니다. - noseratio

19

Microsoft.net 4.6에서 Task 클래스에는이 목적을위한 정적 속성이 있습니다.

Task.CompletedTask

https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.completedtask(v=vs.110).aspx

연결된 질문


관련된 질문

최근 질문