다음과 같은 인터페이스가있는 경우 :
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.
감사
달성하려는 대상이 명확하지 않지만 "가장 일반적인 코드"처럼 보이는 한 가지 접근 방법은 어쨌든 비동기 메소드를 작성하는 것일뿐입니다.
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);
}
override
기본 클래스 메소드를 재정의하지 않고 인터페이스를 구현합니다. 나는 CS0161 만 빼고async
변경합니다. - Jon Skeet
return Task.Run(()=>true);
- L.B