J'ai le problème suivant: Application WPF multithread, Model View Presenter Implementation. Les présentateurs et les vues qui appartiennent ensemble sont créés sur un thread séparé et reçoivent un répartiteur distinct. Maintenant, quelqu'un appelle d'un autre thread une méthode sur le Presenter. J'intercepte l'appel, et maintenant commence le problème: si l'appel vient du même fil que le présentateur, je veux continuer l'appel, sinon invoquer l'appel sur Dispatcherthread, de sorte que je n'ai pas besoin de se soucier de Appels d'interface utilisateur J'ai déjà lu sur l'utilisation de SynchronizationContext, mais cela ne semble pas fonctionner pour moi parce que si le thread appelant n'est pas un thread UI je ne peux pas comparer les 2 contextes. Quelle est une solution possible, fonctionnelle et élégante?Comment déléguer un appel de méthode à un autre thread?
1
A
Répondre
3
if(presenterDispatcherObject.CheckAccess())
Doit();
else
presenterDispatcherObject.BeginInvoke(DispatcherPriority.Normal,() => DoIt());
0
Si vous souhaitez que l'appel de Dispatcher se bloque (attendez le retour), j'utiliserais Invoke au lieu de BeginInvoke. Cela imiterait davantage le comportement d'appel de la fonction directement. Appelez des blocs appelant le thread jusqu'à ce que la fonction soit terminée (plus comme un Send32Message Win32). BeginInvoke juste posts et retourne sans attendre la fonction à retourner (comme un PostMessage Win32).
CheckAccess est lent. Je limiterais CheckAccess en gardant les appels moins bavards sur différents threads.
public delegate bool MyFuncHandler(object arg);
bool ThreadedMyFunc(object arg)
{
//...
bool result;
//...
// use dispatcher passed in, I would pass into the contructor of your class
if (dispatcher.CheckAccess())
{
result = MyFunc(arg);
}
else
{
result = dispatcher.Invoke(new MyFuncHandler(MyFunc), arg);
}
return result;
}
bool MyFunc(object arg)
{
//...
}
Questions connexes
- 1. Comment limiter une méthode à un thread particulier?
- 2. Appel d'une méthode sur un autre formulaire en C#
- 3. Différer BufferedWriter.write à un autre thread
- 4. Rhino Mocks: Comment simuler un appel de méthode dans un appel de méthode?
- 5. Passer un msg à un autre thread dans C#
- 6. Passer un appel de procédure stockée d'un contexte de données LINQ à une autre méthode. C#
- 7. Comment puis-je tester une méthode contenant un appel asynchrone?
- 8. ASP.Net ScriptControl - Appel d'une méthode d'un autre
- 9. Écrire dans un TextBox à partir d'un autre thread?
- 10. Comment détecter un appel Selector.wakeup
- 11. Appel d'une méthode lorsque le thread se termine
- 12. Ajouter des contrôles à WinForms dynamiquement dans un autre thread
- 13. Appel d'une méthode avec un SoapExtensionAttribute
- 14. Comment remplacer un objet linq d'un appel de méthode
- 15. Comment intercepter un appel de méthode dans Boo?
- 16. Sur Win32, comment déplacez-vous un thread vers un autre core CPU?
- 17. Appel de setNeedsDisplay sur un UIView d'une autre classe
- 18. Comment déléguer dans un crontab pour utiliser un autre fichier comme crontab? aka Crontab dans SVN/CVS?
- 19. Pouvez-vous faire un appel AJAX à l'intérieur d'un autre appel AJAX dans jquery?
- 20. Appel de la méthode de service WCF via un navigateur
- 21. Comment arrêter l'exécution d'un appel de méthode dans WCF après un délai de transaction
- 22. vim fu, échange de paramètres pour un appel de méthode
- 23. Comment déléguer l'implémentation de l'interface à l'autre classe en C#
- 24. Appel de super à partir d'une méthode avec alias
- 25. Comment lancer un autre appel jQuery .ajax basé sur le résultat d'un appel initial .ajax?
- 26. Déclenchement d'une méthode pour exécution dans un thread séparé
- 27. Distorsions d'image lors du traitement sur un autre thread
- 28. Comment passer des paramètres à un objet Thread?
- 29. Un service Web .NET instancié avec chaque appel de méthode?
- 30. Débloquer un thread d'un autre processus, en C++