web-dev-qa-db-fra.com

Impossible de déclarer l'interface "tâche asynchrone <myObject> MyMethod (Object myObj);"

Je ne peux pas déclarer

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

Le compilateur me dit:

  • Le modificateur async n'est pas valide pour cet élément
  • Le modificateur async ne peut être utilisé que pour les méthodes qui ont un corps

Est-ce quelque chose qui devrait être mis en œuvre, ou la nature de l'async et de l'attente empêche-t-elle que cela se produise?

48
goodguys_activate

Qu'une méthode soit implémentée en utilisant async/wait ou non est un détail d'implémentation. Le comportement de la méthode est un détail du contrat, qui doit être spécifié de manière normale.

Notez que si vous faites en sorte que la méthode retourne un Task ou un Task<T>, il est plus évident qu'il est censé être asynchrone et sera probablement difficile à implémenter sans être asynchrone.

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

58
stuartd

Que votre implémentation soit asynchrone ou non, n'a aucun rapport avec votre interface. En d'autres termes, l'interface ne peut pas spécifier qu'une méthode donnée doit être implémentée de manière asynchrone.

Retirez simplement async de votre interface et elle se compilera; cependant, il n'existe aucun moyen d'imposer une implémentation asynchrone simplement en spécifiant une interface.

17
Roy Dictus

Si vous avez une interface avec deux implémentations (une qui est vraiment asynchrone et l'autre qui est synchrone), voici à quoi cela ressemblerait pour chaque implémentation - les deux renvoyant un Task<bool>.

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

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

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

S'il s'agit d'une méthode nulle, vous devez return Task.CompletedTask; à partir de la méthode non asynchrone (je pense que .NET 4.5 et versions ultérieures)

Voir aussi: Retourner la tâche <bool> instantanément

5
Simon_Weaver