Retour la liste de async/await méthode
Je veux faire un webservice demande asynchron. Je l'appelle ici:
List<Item> list = GetListAsync();
Voici la déclaration de ma fonction, qui doit retourner une liste:
private async Task<List<Item>> GetListAsync(){
List<Item> list = await Task.Run(() => manager.GetList());
return list;
}
Si je veux de la compilation j'obtiens l'erreur suivante
Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List<Item>> to System.Collections.Generic.List<Item>
Que je sais que Si j'utilise le async
modifier le résultat est automatiquement emballé avec de la Tâche. Je pense que cela n'arrive pas parce que j'utilise Task.Run
. Si je supprime le Task.Run(() =>
partie-je obtenir
De ne pas attendre du Système.Les Collections.Génériques.Expression de liste
Je pense que je n'ai pas bien compris la async/await méthodes. Ce que je fais mal?
double possible de Impossible de convertir implicitement le type de Tâche<>
OriginalL'auteur testing | 2014-09-08
Vous devez vous connecter pour publier un commentaire.
Vous devez corriger votre code d'attendre la liste à être téléchargé:
Aussi, assurez-vous que la méthode, où ce code est situé, a
async
modificateur.La raison pour laquelle vous obtenez cette erreur, c'est que
GetListAsync
méthode retourne unTask<T>
qui n'est pas un formulaire de résultat. Que votre liste est téléchargé de manière asynchrone (en raison deTask.Run()
) vous avez besoin d'extraire la valeur de la tâche à l'aide de laawait
mot-clé.Si vous supprimez
Task.Run()
, vous liste sera téléchargé de manière synchrone et vous n'avez pas besoin d'utiliserTask
,async
ouawait
.Une suggestion: vous n'avez pas besoin d'attendre dans
GetListAsync
méthode si la seule chose à faire est de déléguer l'exploitation à un thread différent, de sorte que vous pouvez raccourcir votre code de la manière suivante:async
méthode (si elles n'ont pas déjà).Ce que je ne comprends pas est pourquoi je dois
await
deux fois?vous devez attendre deux fois parce que vous avez 2 appels asynchrones
Puis-je avoir deux appels asynchrones ou un seul (et le second est pour "extraire")?
Avez-vous 2, vous êtes en attente de la tâche en vous
GetListAsync
méthode, alors vous êtes en attente de la méthode elle-même dans votre code appelantOriginalL'auteur takemyoxygen
En plus de @takemyoxygen la réponse de la convention d'avoir un nom de fonction qui se termine dans
Async
est que cette fonction est vraiment asynchrone. I. e. il ne permet pas de démarrer un nouveau thread et il n'est pas simplement appelerTask.Run
. Si c'est le code qui est dans votre fonction, il sera préférable de le supprimer complètement et simplement:oui je pense que ça devrait être OK, commencer un nouveau thread n'est pas l'idéal, mais je pense que la ligne directrice est plus sur l'appel d'une version synchrone de la fonction à l'intérieur de
Task.Run
OriginalL'auteur Ned Stoyanov