Comprendre la file d'attente du répartiteur
Je pense que j'ai besoin d'aide pour comprendre le Répartiteur de la File d'attente.
Quand un nouveau travail arrive, il est ajouté au début de la file d'attente dispatcher et lorsque le Répartiteur veut un processus de travail de l'élément, il est supprimé depuis le début.
Dans des termes plus généraux: Si il y a du travail, il est stocké dans une FIFO de manière à l'intérieur de la file d'attente et traitées tant il n'y a pas de travail à gauche.
La documentation MSDN ici est en se référant à un loop
et un frame
:
The Dispatcher processes the work item queue in a loop. The loop is referred to as a frame.
Mais où est une boucle dans ce contexte ? Pour moi, la boucle est quelque chose qui effectue une itération sur quelque chose et quand il atteint la fin il recommence de nouveau.
Et quel est le concept d'un frame
? Selon la documentation MSDN un cadre est un coup de poing de travail les éléments à l'intérieur de la file d'attente ? Si c'est vrai comment la méthode statique Disptatcher.PushFrame()
être utilisé ?
Et la question la plus intéressante est de savoir si il existe un moyen pour obtenir l'état actuel de la file d'attente en particulier le nombre d'éléments dans la file d'attente.
Tient-il si une méthode qui a été invoquée devant (et à cet effet, mettre dans la file d'attente Dispatcher) est exécuté qu'il est ensuite retiré de la file d'attente immédiatement ou faut-il le dernier à l'intérieur pour une autre période de temps ?
Je sais, beaucoup de questions 🙂
source d'informationauteur marc wellman
Vous devez vous connecter pour publier un commentaire.
Il y a très peu de documentation concernant les
Dispatcher
de sorte que vous aurez à démonter un peu de savoir sur le fonctionnement interne.Un répartiteur est fondamentalement quelque chose qui effectue un travail autour de l'application de la Message De La Pompe. Celui en question se trouve sur le dessus de la windows boucle de message.
En conséquence, il ne peut être une application Répartiteur - la mondiale répartiteur objet accessible par
Application.Current.Dispatcher
. D'autres répartiteurs sont possibles par l'accèsDispatcher.CurrentDispatcher
qui, selon la documentationCependant, l'appel de
Run
sur ce nouveau répartiteur sera de blocage.Lorsque vous faites un
Dispatcher.PushFrame
il pousse un cadre sur le répartiteur actuel. Rien qui hérite deDispatcherObject
commeDispatcherFrame
aura son répartiteur ensemble de l'actuel. Nous pouvons le vérifier en regardant son constructeur.Bien sûr, avoir une simple boucle d'événement n'est pas assez, il ya des moments où vous avez besoin de renverser le courant de boucle d'événement de force les autres à faire. Et c'est pourquoi vous avez un
DispatcherFrame
. C'est ce qui constitue réellement la boucle d'événements. Lorsque vous appuyez sur un cadre dans le Répartiteur, c'est ce qui se passe:C'est dans la
TranslateAndDispatchMessage
que la priorité de la file d'attente dans le Répartiteur reçoit évalué, après qu'un message est sorti.Si l'opération prend du temps pour s'exécuter sur le répartiteur, il s'arrête temporairement la boucle d'événement, et parce qu'il ne répond pas à la signalisation, l'application semble qu'il cesse de répondre.
Voici un article qui utilise un cadre en vigueur de l'INTERFACE utilisateur de répondre en permettant à la boucle d'événements de lancer bientôt.
Comme pour l'accès à la file d'attente, comme il est, il n'y a aucun moyen de connaître l'état de la file d'attente à l'extérieur du Répartiteur. C'est un détail interne, et il est raisonnable qu'elle n'est pas exposée.