supposer au lieu de l'enveloppe Le le code dans le répartiteur code> est toujours exécuté avant que le Peut-on expliquer ce comportement? Merci p> WPF, .NET Framework 4.7 Projet P> P> graphviewmodels code> est un Observablecollection updateChartSwithValuesasync Code> Methode appelle dans le Continuwith code> Délégué, la méthode n'est plus attendue. J'ai déjà essayé de changer le configureawait (false) code> sur vrai code> mais rien ne semble changer. Au-dessous du code édité: p> reste continue avec code> délégué code> 't attendre updatechartwithvaluesasync code> pour compléter plus, levant des bugs méchants. p>
3 Réponses :
Lorsque vous utilisez . Dans votre deuxième exemple, vous n'attendez pas cela directement; Vous attendez le résultat de l'expression chaînée: p> alors que seul l'objet final ( Si vous utilisez async / attendre, il serait prudent de < / Strong> Utilisez les mots-clés d'une méthode asynchrone, car le mélange avec les opérations basées sur le rappel conduit à un code déroutant tel que celui-ci. P> P> Dispatcher.Invokeasync code> renvoie un DispatcherOveration code>. Ceci est un type attendable, car il implémente une méthode appelée getawaiter () code> qui renvoie un type qui implique inotifycompletion code>. attendre code > sur le résultat de Dispatcher.invokeasync code> directement, l'achèvement de DispatcherOperSeration code> est attendu avant l'appel sur updateChartSwithvaluesasync code>. P> tâche code>) est attendu, ce qui signifie que la fonction que vous passez à < Code> Continuwith code> peut être exécuté, avant Dispatcher.invokeasync code> est terminé. p>
Comme autre réponse mentionnée, vous ne devriez pas mettre Si vous voulez vraiment attendre pour continuer à finir dans la plupart des Notez que async t => attendre updateCharetswithvitvaluesasync code> dans votre Continuwith code> rappel, car il aurait en attente de la tâche > Continuwith (...) Code> Méthode, qui finirait éventuellement à finir immédiatement. attendre code>, vous devriez Débit ( ) CODE> Votre Tâche attendre code> est traduit en bloc de code impliquant Continuwith code> qui fonctionnalités ConfigureAWAIT code> Options et plus, donc vous feriez mieux d'utiliser async attendre code> constructions comme si vous avez essayé dans votre premier exemple. p> p>
Mettez simplement, Ce que je suggère, n'utilisez pas Voici une autre question connexe dans le sujet: Utilisez un rappel ASYNC avec la tâche.Continuewith P>
Si vous voulez en savoir plus en profondeur, le code source de .Continuewith () code> ne fait pas attendre code> dans sa mise en œuvre, il exécute plutôt la transmission du délégué tel qu'il est et renvoie une tâche de tâche ( Tâche .Continuewith () code> Dans ce cas, il suffit de vous attendre. Si vous souhaitez vraiment conserver le code actuel, vous pouvez faire .Continuewith (). Doulez () code>, qu'est-ce qui fera le tour? P>
continue avec code>: https://referencesource.microsoft.com/#msmscorlib/system/threading/tasks/task.cs 4532 p>
Bonne réponse. Une alternative à Le débouché code> est en attente de deux fois: attendre code >
Je ne suis pas expert, mais je pense que UpdatechartThithValuesasync est en fait attendu, mais sur un autre fil. Essayez de ne pas mélanger ASYNC / Attendre avec des outils surtout utiles avant que ASYNC / AWAIT n'existait (comme Continuwith ... Je ne sais pas pourquoi vous voudriez l'utiliser ici).