async attendent le retour Tâche<List<T>> au lieu de<T> sur l'appel de méthode aync
Je suis en train d'essayer de comprendre l'utilisation de async attendent et j'ai étudié quelques billets de blog et maintenant, j'ai fait un test de code mais il ne fonctionne pas de la façon dont je m'attends à ce que cela fonctionne.
J'ai une méthode qui renvoie la Liste:
private List<Employee> GetEmployees()
{
IList<Employee> list = new List<Employee>();
list.Add(new Employee() { Id = 1, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 2, Age = 30, Name = "Alen" });
list.Add(new Employee() { Id = 3, Age = 20, Name = "Suresh" });
list.Add(new Employee() { Id = 4, Age = 30, Name = "Jay" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Nanda" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 1, Age = 23, Name = "Test" });
return list;
}
Ensuite, j'ai écrit ma méthode async:
private async Task<List<Employee>> TestEmployeesGetAsync()
{
var result = await Task.Run(() => GetEmployees());
return result;
}
Lorsque j'appelle cette méthode :
var Result = TestEmployeesGetAsync();
Visual studio me dit qu'il retourne Task<List<T>>
et d'usage:
List<Employee> result = await TestEmployeesGetAsync();
Pourquoi j'ai besoin de mettre attendent sur la méthode d'appel si j'ai mis await
il donne erreur du compilateur, bien sûr, parce que await
devrait avoir asynchrone. Quelqu'un peut-il effacer mon esprit comment appeler afin que je puisse obtenir List<T>
au lieu de Task<List<T>>
comment je peux obtenir
List<T>
d'ellevous avez déjà montré comment obtenir
List<T>
mais vous avez besoin de mettre async
mot clé sur la méthode ainsi await
peut être utilisé.j'ai fait méthode async maintenant ce que je veux, c'est à l'appeler et obtenir
List<T>
pour appeler ma méthode async je dois faire une autre méthode?Jetez un oeil à des articles sur la mon
async-await
curation pour apprendre async-await
et comment l'utiliser.
OriginalL'auteur Ehsan Sajjad | 2014-12-05
Vous devez vous connecter pour publier un commentaire.
Il y a un peu de dépendances le compilateur besoins afin de comprendre que vous êtes l'exécution d'une méthode asynchrone. Le signal est le
async
modificateur sur la déclaration de la méthode. Une fois que vous marquez commeasync
, vous pouvez utiliser leawait
mot-clé. C'est pourquoi async se propage "tout le chemin" en bas de la pile d'appel, comme lorsque vous appelez une méthode async et de la nécessité d'attendre son résultat, vous aurez besoin de marquer le consommer méthode async modificateur.Afin de faire de votre méthode de travail, vous devez effectuer les opérations suivantes:
Comme une note de côté, sachez que vous ne devriez pas vous exposer async wrappers plus de modes de synchronisation.
99% du temps, c'est la façon dont vous doit appeler votre code asynchrone.
ok. Merci pour poiting.
OriginalL'auteur Yuval Itzchakov
Vous avez essentiellement besoin d'attendre le résultat de la tâche retourné par
TestEmployeesGetAsync
. Vous pouvez le faire asyncrhonously avecawait
qui déballe le résultat pour vous deList<Employee>
ou vous pouvez obtenir le résultat de la tâche avec lesResult
de la propriété. Cependant qui peut provoquer un blocage de sorte que vous devez être prudent.Avec
async-await
il a tendance à faire son chemin jusqu'à l'appel de la chaîne, c'est à dire en attente d'unasync
méthode vous oblige à le faire dans un autreasync
méthode ( comme vous l'avez trouvé), et en attendant que la méthode vous oblige à être encore un autreasync
méthode, et donc laasync
méthodes de propagation à travers la base de code jusqu'à ce que vous atteignez un gestionnaire d'événement ouMain
(qui ne peut pas être marquéasync
).Cette prolifération de
async
méthodes n'est pas rare, et pour éviter cela, vous pouvez attendre que la tâche à effectuer avecTask.Wait
etTask.Result
mais ceux-ci sont le blocage de la méthode et peut provoquer ladite impasse. C'est aussi un anti-modèle appelé synchronisation sur async et il défait le but de faire le travail de manière asynchrone, vous finirez blocage à attendre la fin de toute façon.Comme l'a souligné @BenVoigt, une exception est lorsque vous le coup d'envoi de plusieurs demandes asynchrones et bloquer en attente pour toutes les tâches à remplir avec
Task.WaitAll
.Task.WaitAll
.Je voudrais étendre sur les "il a tendance à faire son chemin jusqu'à l'appel de la chaîne". Si vous ne savez pas encore ce que cela signifie, il serait difficile de comprendre cette phrase.
Merci pour les commentaires, j'ai mis à jour la réponse.
OriginalL'auteur Ned Stoyanov