2008-12-04 11 views
1

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?

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