Comprendre le Dispatcher WPF.BeginInvoke

J'étais sous l'impression que le dispatcher suivra la priorité
des opérations en file d'attente et exécuter les opérations sur la base de la priorité
ou l'ordre dans lequel l'opération a été ajouté à la file d'attente(si même priorité)
jusqu'à ce qu'on m'a dit que ce n'est pas le cas dans le cas de la WPF UI dispatcher.

M'a dit que si une opération sur le thread de l'INTERFACE utilisateur prend de plus longue durée-dire une base de données en lecture
l'INTERFACE utilisateur répartiteur simple tente d'exécuter la prochaine série d'opérations dans la file d'attente.
Je ne pouvais pas venir à termes avec elle donc décidé d'écrire un exemple d'application WPF qui contient un bouton et trois rectangles, cliquez sur le bouton, les rectangles sont remplis avec des couleurs différentes.

<StackPanel>
    <Button x:Name="FillColors" Width="100" Height="100" 
            Content="Fill Colors" Click="OnFillColorsClick"/>
    <TextBlock Width="100" Text="{Binding Order}"/>
    <Rectangle x:Name="RectangleOne" Margin="5" Width="100" Height="100" Fill="{Binding BrushOne}" />
    <Rectangle x:Name="RectangleTwo" Margin="5" Width="100" Height="100" Fill="{Binding BrushTwo}"/>
    <Rectangle x:Name="RectangleThree" Margin="5" Width="100" Height="100" Fill="{Binding BrushThree}"/>
</StackPanel>

et dans le code-behind

private void OnFillColorsClick(object sender, RoutedEventArgs e)
{
    var dispatcher = Application.Current.MainWindow.Dispatcher;

    dispatcher.BeginInvoke(new Action(() =>
    {
        //dispatcher.BeginInvoke(new Action(SetBrushOneColor), (DispatcherPriority)4);
        //dispatcher.BeginInvoke(new Action(SetBrushTwoColor), (DispatcherPriority)5);
        //dispatcher.BeginInvoke(new Action(SetBrushThreeColor), (DispatcherPriority)6);

        dispatcher.BeginInvoke(new Action(SetBrushOneColor));
        dispatcher.BeginInvoke(new Action(SetBrushTwoColor));
        dispatcher.BeginInvoke(new Action(SetBrushThreeColor));

    }), (DispatcherPriority)10);
}

private void SetBrushOneColor()
{
    Thread.Sleep(10 * 1000);
    Order = "One";
    //MessageBox.Show("One");
    BrushOne = Brushes.Red;
}

private void SetBrushTwoColor()
{
    Thread.Sleep(12 * 1000);
    Order = "Two";
    //MessageBox.Show("Two");
    BrushTwo = Brushes.Green;
}

private void SetBrushThreeColor()
{
    Thread.Sleep(15 * 1000);
    Order = "Three";
    //MessageBox.Show("Three");
    BrushThree = Brushes.Blue;
}

public string Order
{
    get { return _order; }
    set
    {
        _order += string.Format("{0}, ", value);
        RaisePropertyChanged("Order");
    }
}

Le code commenté fonctionne comme prévu les méthodes sont appelées en fonction de la DispatcherPriority et j'ai aussi la chance de voir de rafraîchissement de l'écran après chaque opération a été terminée.
Order est One, Two, Three. Les couleurs sont tirés l'un après l'autre.

Maintenant le code de travail où la DispatcherPriority n'est pas mentionné
( Je suppose que c'est par défaut à Normal) l'ordre est toujours One, Two, Three mais si je montre un MessageBox à l'intérieur de l'méthodes, l'
Thrid popup est de montrer d'abord, puis Two puis One mais quand je debug j'ai pu voir les méthodes sont
invoquée dans l'ordre attendu (IntelliTrace montre même qu'une boîte de message est affiché mais je ne le vois pas sur l'écran à ce moment et seulement après la dernière opération est terminée.) c'est juste que le MessageBoxes sont affichés dans l'ordre inverse.

Est-ce parce que MessageBox.Show est un appel bloquant et le fonctionnement sont effacées après le message a été fermé.
Même alors, l'ordre de la MessageBox devrait également être OneTwo andTrois"?

source d'informationauteur Vignesh.N