46

신고 할 수 없습니다.

interface IMyInterface
{
   async Task<myObject> MyMethod(Object myObj);
}

컴파일러는 다음과 같이 알려줍니다.

  • 수정 자 비동기가이 항목에 유효하지 않습니다.
  • 비동기 한정자는 본문이있는 메서드에만 사용할 수 있습니다.

이것이 구현되어야하는 것입니까, 아니면 async & 언제 까지나 이런 일이 벌어지기를 기다리고 있습니까?

3 답변


51

메소드가 async / await를 사용하여 구현되는지 여부는   구현 세부 사항. 메소드가 작동하는 방식은 계약입니다.   세부 사항은 정상적인 방법으로 지정되어야합니다.

이 메소드가Task또는Task<T>, 그 이상이다.   그것은 비동기적임을 분명히하고, 아마 힘들 것입니다.   비동기가 아닌 구현.

에서https://stackoverflow.com/a/6274601/43846


  • +1 Jon Skeet이 말했습니다. :) - Noctis

16

구현이 비동기식이든 아니든 인터페이스와의 관련성은 없습니다. 즉, 인터페이스는 주어진 메소드가 비동기 방식으로 구현되어야한다고 지정할 수 없습니다.

그냥 가져async귀하의 인터페이스 밖으로 그것은 컴파일됩니다; 그러나 인터페이스를 지정하는 것만으로 비동기 구현을 시행 할 방법이 없습니다.


4

두 개의 구현 (하나는 진정으로 비동기식이고 다른 하나는 동기식)을 사용하는 인터페이스가있는 경우 이것은 각 구현에 대해 다음과 같이 나타납니다.Task<bool>.

public interface IUserManager
{
    Task<bool> IsUserInRole(string roleName);
}

public class UserManager1
{
    public async Task<bool> IsUserInRole(string roleName)
    {
        return await _userManager.IsInRoleAsync(_profile.Id, roleName);
    }
}

public class UserManager2
{
    public Task<bool> IsUserInRole(string roleName)
    {
        return Task.FromResult(Roles.IsUserInRole(roleName));
    }
}

그것이 당신이 필요로하는 무효 방법 인 경우return Task.CompletedTask;비동기 메서드에서 (나는 .NET 4.5 이상을 생각한다)

참조 :작업 되돌리기 < bool > 곧


  • 당신은 클래스 정의에 인터페이스를 구현하는 것을 잊었다. - SutharMonil

연결된 질문


관련된 질문

최근 질문