Question

J'ai commencé à introduire une programmation parallèle dans mon application WPF pour accélérer les tâches les plus intensives et répétitives. Cela se passe bien, en ce sens que je vois des différences notables dans le temps d'exécution et la réponse à l'interface utilisateur perçue.

J'ai évidemment pris soin de m'assurer qu'il n'y a pas d'accès simultané aux données pertinentes de mon thread d'interface utilisateur et de ces threads de tâche.

Mais - parfois (pas tout le temps), mon programme s'écrase, et il s'avère que le gestionnaire de canexucéen d'une commande essaie d'accéder aux mêmes données qui sont traitées dans une tâche parallèle. Ou, à l'inverse, ma tâche parallèle échoue car les données sont déjà utilisées par un gestionnaire de canexuïté.

Existe-t-il un moyen recommandé de régler ce problème? Puis-je désactiver la vérification de Canexute? Dois-je ajouter un test à chaque méthode canexuée?

(Sur une note secondaire, en examinant ce problème, je suis extrêmement surpris de voir à quelle fréquence les gestionnaires de canexucées sont appelés! Une partie de moi pense, pour des raisons de performance, cela valait la peine de permettre et de désactiver manuellement les commandes, mais c'est sûrement que Une sorte de tâche subalterne que WPF essaie de nous faciliter la manière!)

Était-ce utile?

La solution

Oui, cela m'a aussi dérangé, combien de fois Canexute est appelé. La seule option à laquelle je peux penser, car vous avez peu de contrôle de la vérification de Caneexecure, est de minimiser le code dans le gestionnaire et d'utiliser un champ local Caneexute.

Quelque chose comme ça:

CanExecuteSaveData ()
  {
  return _canTheDataBeSaved;
  }

Et construire une vérification de la concurrence dans ce code pour éviter les problèmes de concurrence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top