8

다음과 같은 인터페이스가있는 경우 :

using System.Threading.Tasks;

...

public interface IFoo
{
  Task doIt();

  Task<bool> doItAndReturnStuff();
}

이 인터페이스를 구현하는 클래스 중 하나가 비동기 메소드를 필요로하지 않는 경우 어떻게하면이 함수를 재정의 할 수 있습니까?

다시 말해, Task 객체에 래핑 된 "void"및 "bool"을 올바르게 반환하려면 어떻게해야합니까?

예 :

public class FooHappensToNotNeedAsync : IFoo
{
  public override Task doIt()
  {
    // If I don't return anything here, I get
    // error that not all code paths return a value.
    // Can I just return null?
  }

  public override Task<bool> doItAndReturnStuff()
  {
    // If I want to return true, how to I do it?
    // This doesn't work:
    return true;
  }
}

참고 -이 인터페이스를 구현하는 클래스 중 일부는 완전하게 작업 항목을 완전히 제거 할 수 없습니다.아르사실 asynch.

감사


  • return Task.Run(()=>true); - L.B
  • @ L.B : 이는 실제 이유가없는 추가 작업을 생성하며 이미 완료된 작업을 반환하는 것보다 예측이 쉽지 않습니다. - Jon Skeet

1 답변


15

달성하려는 대상이 명확하지 않지만 "가장 일반적인 코드"처럼 보이는 한 가지 접근 방법은 어쨌든 비동기 메소드를 작성하는 것일뿐입니다.

public async Task DoIt()
{
    // No-op
}

public async Task<bool> DoItAndReturnStuff()
{
    return true;
}

어떤 것도없이await표현식을 사용하면 메소드가 동기식으로 완료됩니다. 각 메소드에 대한 경고가 표시되지만,이 메소드는#pragma.

대안으로 - 그리고 나는 더 간단하게#pragma경고를 비활성화하려면 - 사용하는 것입니다.Task.FromResult:

public Task DoIt()
{
    // Returns a Task<bool>, but that's okay - it's still a Task
    return Task.FromResult(true);
}

public Task<bool> DoItAndReturnStuff()
{
    return Task.FromResult(true);
}


  • 위의 첫 번째 코드 스 니펫 - " 아마도 어쨌든 비동기 메소드로 만들 것입니다. " - 컴파일되지 않습니다. 그것이 내가이 질문을하는 이유입니다. " 오류 CS0161 : 모든 코드 경로가 값을 반환하지는 않습니다 "라는 메시지가 표시됩니다. 나는 당신이 거기에 약간 snarky 코멘트를 가지고 있었던 이유를 추측한다. 그러나 두 번째 발췌 문장, 특히 DoIt () 구현은 정확히 내가 찾고있는 해킹 유형입니다. 많은 감사합니다! - swinefeaster
  • @swinefeaster : 비동기 수정자를 포함했다면 첫 번째 버전을 컴파일해야합니다. 그랬습니까? 컴퓨터를 사용할 때 다시 확인합니다. - Jon Skeet
  • @swinefeaster : 방금 시도했는데, 괜찮습니다.override기본 클래스 메소드를 재정의하지 않고 인터페이스를 구현합니다. 나는 CS0161 만 빼고async변경합니다. - Jon Skeet
  • 아, 맞아! 비동기 수정자가 없습니다. 건배! - swinefeaster
  • Dang,하지만 다음 경고가 표시됩니다. "이 비동기 메소드가 부족합니다 ' 연산자와 동기식으로 실행됩니다. ' 기다리기 ' 운영자가 비 차단 API 호출을 기다리거나 Task.Run (...) '을 기다리고 있습니다. 백그라운드 스레드에서 CPU 바운드 작업을 수행 할 수 있습니다. " - swinefeaster

연결된 질문


관련된 질문

최근 질문