2 votes

Éviter le curseur de la souris en forme de sablier lors de l'appel d'un service web ?

Je ne sais pas s'il s'agit d'un problème général lié aux services Web ou seulement de mon scénario spécifique, qui est une application WPF avec un DispatcherTimer appelant une méthode de service Web. À chaque fois que la minuterie est appelée, le curseur de la souris se transforme automatiquement en curseur en forme de sablier.

Le traitement de l'appel est très court et se produit toutes les 3 secondes, de sorte que l'expérience de l'utilisateur est que toutes les 3 secondes, la souris se transforme en sablier pendant une fraction de seconde, puis revient à la représentation normale du curseur.

Comment puis-je éviter ce désagrément ?

Merci.

3voto

Andrew Anderson Points 1823

Est-ce que toute l'application ne répond plus lorsque la minuterie se déclenche également, ou est-ce que le processus est trop rapide pour être remarqué ?

Je suppose que vous invoquez du code de manière synchrone sur votre DispatcherTimer, ce qui pourrait provoquer de brefs moments de non-réponse (et peut-être le sablier). Pour contourner ce problème, assurez-vous que l'événement Tick de votre Dispatcher est un code asynchrone.

Voici un petit exemple simple qui, toutes les 3 secondes, effectue une seconde de faux travail puis met à jour l'interface graphique :

public partial class MainWindow : Window
{
    private static int foo = 0;

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(3000);
        timer.Tick += new EventHandler(delegate(object o, EventArgs args)
        {
            StatusBox.Text = "Incrementing";

            ThreadStart start = delegate()
            {
                // Simulate work
                Thread.Sleep(1000);

                // Update gui
                this.Dispatcher.BeginInvoke(new Action(delegate
                {
                    CountingBox.Text = (foo++).ToString();
                    StatusBox.Text = "Waiting";
                }));
            };

            new Thread(start).Start();                
        });

        timer.Start();
    }
}

(Il existe d'autres méthodes pour atteindre les mêmes objectifs, mais celle-ci était simple à énoncer. Voir les conseils ici pour plus d'informations : http://msdn.microsoft.com/en-us/magazine/cc163328.aspx )

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