2012-10-24 10 views
35

jestem w stanie zadeklarowaćNie można zadeklarować interfejsu "asynchroniczny Task <myObject> myMethod (Object myObj);"

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

kompilator mówi mi:

  • Modyfikator asynchroniczny nie jest ważny ta pozycja
  • modyfikator asynchroniczne mogą być wykorzystywane jedynie do metod, które mają ciało

Czy to coś, co powinno zostać zaimplementowane, czy też charakter asynchronicznego oczekiwania czeka na to, aby to się nie wydarzyło?

Odpowiedz

42

To, czy zaimplementowana jest metoda async/await, czy nie, stanowi szczegół implementacji . Sposób, w jaki powinna zachowywać się metoda, to szczegół, który należy podać w normalny sposób.

Zauważ, że jeśli popełnisz metoda zwróci Task lub Task<T>, to bardziej oczywiste, że to ma być asynchroniczny, i prawdopodobnie będzie ciężko wdrożyć bez asynchroniczny.

Od https://stackoverflow.com/a/6274601/43846

+1

+1 Jon Skeet mówi:) – Noctis

13

, czy implementacja jest asynchroniczny, nie ma znaczenia dla interfejsu. Innymi słowy, interfejs nie może określić, że dana metoda musi być zaimplementowana w sposób asynchroniczny.

Po prostu wyjmij async z interfejsu i skompiluj; jednak nie ma sposobu na wymuszenie implementacji asynchronicznej po prostu przez określenie interfejsu.

1

Jeśli masz interfejs z dwiema implementacjami, tak będzie wyglądać dla każdej implementacji.

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)); 
    } 
} 

Jeśli jest to metoda void trzeba return Task.CompletedTask; z braku metody asynchronicznej (myślę .NET 4.5 i nowsze)

Patrz także: Return Task<bool> instantly