2012-10-24 4 views

risposta

42

Se un metodo viene implementato utilizzando async/await o no è un dettaglio di implementazione . Come dovrebbe comportarsi il metodo è un dettaglio del contratto , che dovrebbe essere specificato nel modo normale.

Si noti che se si effettua il metodo restituisce un Task o un Task<T>, è più ovvio che è destinata ad essere asincrono, e probabilmente sarà difficile da implementare senza essere asincrono.

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

+1

+1 per Jon Skeet dice:) – Noctis

13

o meno l'implementazione è asincrono, non è rilevante per l'interfaccia. In altre parole, l'interfaccia non può specificare che un determinato metodo debba essere implementato in modo asincrono.

Basta prendere async dall'interfaccia e verrà compilato; tuttavia, non è possibile applicare l'implementazione asincrona semplicemente specificando un'interfaccia.

1

Se si dispone di un'interfaccia con due implementazioni, questo è l'aspetto che assumerà per ciascuna implementazione.

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

Se si tratta di un metodo di vuoto è necessario return Task.CompletedTask; dal metodo non asincrono (credo .NET 4.5 e versioni successive)

Vedi anche: Return Task<bool> instantly

Problemi correlati