Je ne peux pas déclarer
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
Le compilateur me dit:
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?
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 unTask<T>
, il est plus évident qu'il est censé être asynchrone et sera probablement difficile à implémenter sans être asynchrone.
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.
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