Merci DonQuiche.
Ca fait pas mal d'éléments à assimiler. Je vais regarder du côté de threadpool pour voir comment ça marche.
* Tout envoi vers le ThreadPool prend quelques centaines de nanosecondes, dès lors ton unité de travail devrait être au moins de dix microsecondes pour ne pas gaspiller. Ajuste la taille de tes lots pour te situer dans cet ordre là.
Pas de problème de ce côté là, j'ai de nombreuses manipulations de datarow & datatables dans ma procédure à paralléliser. Le temps de moulinette serait plutôt de l'ordre des 400 ms. Pour simplifier le problème dans mon premier message, j'ai expliqué que je lançais cette procédure toutes les 10 itérations, mais en pratique, ça change à chaque fois. La fourchette classique serait plus entre 1 et 50.
* En termes de choix des API oublie BackgroundWorker (seulement conçu pour interagir avec l'UI et plutôt obsolète même pour cet usage depuis l'arrivée des tâches et async/await). Enfile manuellement tes lots via ThreadPool.QueueUserWorkItem ou bien passe par Task.Run ou Parallel.For par exemple.
J'avais découvert les sub/fonctions async/await en commençant ce projet (la dernière fois que j'ai fait du .net, ça remonte au 3.5) pour de la récupération de données de fichier texte. Je ne suis pas sûr de comprendre: je pensais que les fonctions async s'éxécutent dans le thread appelant. Bien qu'elles ne soient pas bloquantes pour la progression, ça ne risque pas de surcharger l'UI?
* Si tu as prévu de mettre à jour l'UI, attention à ce que ça ne devienne pas un point de contention.Utilise BeginInvoke plutôt que Invoke et met à jour aussi peu que possible.
Actuellement, l'UI est mise à jour depuis la sub ProgressChanged attachée au background worker à chaque fois que un paquet d'itérations est traité (de 1 à 50 comme dit au dessus). En faisant abstraction de la question du traitement par lot et par rapport au background worker, ce que tu me dis, c'est donc de mettre les tâches de mon background worker dans une sub async, et de mettre à jour ma progressbar de cette façon:
Me.Dispatcher.BeginInvoke(DispatcherPriority.Background, DirectCast(Sub() ProgressBar.Value = ProgressPercentage, ThreadStart))
J'ai une espèce de carroussel qui tourne pendant mon itération. Il est géré à l'aide d'un timer et tous les 10 sec, il change son contenu. Pas de problème de ce côté là si je passe en async?
merci encore
Partager