L'exécution Asynchrone en Boucle Foreach C# async attendent
J'ai du mal à saisir le concept de base de c# async attendent.
Fondamentalement, ce que j'ai est une Liste d'objets dont j'ai besoin de traiter, le traitement comporte une itération à travers ses propriétés et de rejoindre les cordes, puis la création d'un nouvel objet (dans ce cas appelé trellocard) et, finalement, l'ajout d'une liste de trellocards.
L'itération prend silencieux un long moment, Donc ce que je voudrais faire est de traiter de multiples objets à la manière asynchrone.
J'ai essayé plusieurs méthodes mais, fondamentalement, je veux faire quelque chose comme cela. (dans l'exemple ci-dessous, j'ai enlevé le traitement, et vient de mettre le système.le filetage.fil de discussion.sleep(200). Im attendent que ce n'est PAS une méthode asynchrone, et j'ai pu utiliser des tâches.de retard, mais le point est, mon traitement n'a pas de méthodes asynchrones, je veux juste exécuter l'intégralité de la méthode avec plusieurs instances.
private async Task<List<TrelloCard>> ProcessJobs(IQueryable<IGrouping<CardGrouping, Job>> jobs)
{
List<TrelloCard> cards = new List<TrelloCard>();
foreach (var job in jobs.ToList())
{
card = await ProcessCards(job, cards); //I would like to run multiple instances of the processing
cards.add(card); //Once each instance is finshed it adds it to the list
}
private async Task<TrelloCard> ProcessCards(Job job)
{
System.Threading.Thread.Sleep(2000); //Just for examples sake
return new TrelloCard();
}
Vous devez vous connecter pour publier un commentaire.
Définition Simple serait, Async-Attendent est une partie .Net de la concurrence, qui peut être utilisé pour faire de multiples IO appels, et dans le processus, et non des déchets les Fils, qui sont destinés à des opérations informatiques. Comme son appel à la Base de données, Web services, Réseau des appels, des e /s de Fichier, tout ce qui n'a pas besoin d'un courant de threads du processus
Dans votre cas actuel, où les cas d'utilisation est:
Ce qui semble être un calcul lié opération, jusqu'à ce que et à moins que vous sont en train de faire un ar, pour moi, il semble que vous traversez un objet de mémoire, dans ce cas, le meilleur choix serait:
ConcurrentBag
deSystem.Collections.Concurrent
espace de noms, ou qui jamais de costume le cas d'utilisation au lieu deList<TrelloCard>
, ou vous pouvez envisager la suite de Thread-safe listeVeuillez également noter que, dans le cas où vos méthodes ne sont pas par défaut
Async
, alors vous pouvez les envelopper dans unTask.Run
, àawait
sur, même si cela aurait besoin d'un Thread du pool, mais peut être appelée à l'aide deAsync-Await
Parallel.Foreach
code pour votre cas d'utilisation (je fais un remplacement direct, il semble y avoir un problème dans votre code, depuisProcessCards
fonction, prend juste objet de la Tâche, mais vous êtes aussi en passant la collectionCards
, qui est l'erreur de compilation):Si vous souhaitez qu'elles s'exécutent en parallèle, vous pouvait pondre une nouvelle Tâche pour chaque opération, puis attendre la fin de tous à l'aide de
Task.WhenAll
.jobs.ToList()
, comme il cesserait d'être une opération à distance et toutes les données seront chargées dans la mémoire du processus, donc un calcul lié opération est plus approprié que IO opération. Il serait en fait à l'encontre du but de Async-vous Attendent.Threadpool
fils, vous n'avez pas besoinAsync-Await
, jusqu'à ce que et à moins que vous prévoyez de mettre à jour unUi control
, qui ont toujours besoin d'être fait dans leUi thread context
, sinon une exception (elle est facile à réaliser en utilisant Asynchrone de l'Attendent, comme il n'y a pas de fil). Idéalement, pas de la logique de l'application, qui ne de calcul intensif de travail doit utiliser les Async-Attendent, qui est conçu uniquement pour les IO appels.Task.Run
utiliser un fil de laThreadPool
et l'utilisation async/await pour le maréchal de la poursuite sur le thread de l'INTERFACE utilisateur. Sans async/await que vous auriez à utiliser directement leDispatcher
, ouTaskScheduler.FromCurrentSynchronizationContext
. Stephen Cleary a une grande réponse avec les liens ici que vous pouvez lire.await
mot-clé.Async-Await
jobs.ToList()
est tout simplement de perdre la mémoire. C'est déjàIEnumerable
peut donc être utilisé dans unforeach
.ProcessCards
ne compile pas. Vous avez besoin de quelque chose comme celaMaintenant, vous voulez
ProcessJobs
àretour d'une séquence de TrelloCard
Async-Await
l'utilisation de son important de ne pas fairejobs.ToList()
, car une fois acheté dans la mémoire locale, il peut être un simple traitement en Parallèle au lieu de l'Asynchrone traitement