3 votes

Afficher un message dans l'interface graphique pendant qu'un thread est en cours d'exécution en C#

J'ai une application qui, au premier démarrage et tous les 7 jours, effectue une mise à jour en téléchargeant des fichiers depuis le web.

Cette mise à jour peut prendre jusqu'à 5 minutes en fonction du nombre de fichiers à télécharger.

Ce que je pense faire, c'est exécuter la mise à jour dans un thread séparé afin que le reste de l'interface graphique soit utilisable pendant que la mise à jour est en cours de traitement.

Cela semble être une option viable pour mon application, mais j'aimerais également afficher un message dans l'interface graphique principale, éventuellement dans une barre d'état, qui indique à l'utilisateur que la mise à jour est en cours de traitement et disparaît lorsqu'elle est terminée.

J'ai cherché des moyens de le faire, mais rien ne semble être la solution que je recherche. Est-ce que quelqu'un sait si c'est possible et comment le faire ?

6voto

Douglas Points 25145

Tout ce que vous avez à faire est d'envelopper votre code d'accès à l'interface utilisateur avec un fichier Dispatcher.Invoke de l'arrière-plan. L'appel Dispatcher à utiliser peut être obtenu par l'intermédiaire de l'Agence européenne pour la sécurité et la santé au travail (ESA). Dispatcher propriété de votre UIElement .

En supposant que la méthode ci-dessous soit définie dans la définition de la classe de votre élément d'interface utilisateur :

private void ProcessItems(IList<Item> items)
{
    Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < items.Count; ++i)
        {
            // Code here runs on background thread.
            this.ProcessItem(items[i]);

            this.Dispatcher.Invoke(DispatcherPriority.Normal, () =>
            {
                // Code here runs on UI thread.
                this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count);
            });
        }
    },
        TaskCreationOptions.LongRunning);
}

0voto

Val Bakhtin Points 984

Avec ce petit bonhomme :

internal static class ControlExtensions
{
    internal static void Invoke(this Control control, Action action)
    {
        control.Invoke(action);
    }
 }

vous pouvez l'appeler dans votre code (dans le monde win form, wpf a sa propre solution) :

... form.Invoke(()=>form.SomeControl.SomeProperty=someValue);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X