2010-09-17 3 views
2

Je suis relativement nouveau à WPF. J'examine un code qui ressemble à ceci:Question sur WPF Dispatcher.BeginInvoke appelé par le même fil! Pourquoi?

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    //Queue on dispatcher in the background so it doesn't make the UI slow 
     Dispatcher.BeginInvoke(new dMyDelegate(PerformOperation), DispatcherPriority.Background); 
} 

De ce commentaire, je devine que le code original a estimé que cela était nécessaire pour rendre cependant plus sensible l'interface utilisateur, je crois comprendre que Dispatcher.BeginInvoke exécute simplement quelque chose sur le fil de l'interface utilisateur. Puisque le buttn_Click est déjà sur le thread d'interface utilisateur, quel est le point? Peut-être que je ne comprends pas Dispatcher et BeginInvoke. Je suis assumming que Dispatcher dans ce cas, est le répartiteur appartenant à la classe dans laquelle se trouve cette méthode, qui est MainWindow.xaml. Quelqu'un peut-il m'éclairer?

Merci

Répondre

5

Eh bien, il demande la priorité « de fond », donc il va seulement s'exécuter quand ont été traitées des événements plus importants ... Si cela fait partie d'un grand rafraîchissement de l'écran, il va attendez jusqu'à ce que tout cela soit arrivé avant d'exécuter. Même dans ce cas, si vous faites quoi que ce soit de long (ou faites des appels potentiellement bloquants) alors vous avez raison, cela ne devrait pas du tout tourner sur le thread de l'interface utilisateur.

+0

Ahhh. Je ne me suis pas concentré sur le deuxième paramètre. Ça a du sens. "PerformOperation" sera appelé après tous les événements prioritaires normaux. Quelque part ailleurs dans le code, ils appellent aussi BeginInvoke avec "background" et n'ont pas l'intention de laisser le GUI redessiner en premier. Savez-vous quel niveau est le redessin de l'écran? C'est si je bloque et débloque l'application avec MSWord ou minimise et maximise? Est-ce "normal" ou supérieur? Enfin, il semblerait qu'une fois que PerformOperation démarre, l'interface graphique est verrouillée? Correct? – Dave

+0

@Andrew: Je crains de ne pas connaître les priorités ... mais oui, une fois que PerformOperation démarre, le thread du répartiteur sera verrouillé. Je crois qu'il y a un fil de rendu séparé, ce qui peut éviter d'avoir un écran vide, mais je ne connais pas grand-chose sur les détails. –

+0

Merci! Marqué comme réponse. – Dave

Questions connexes