2 votes

C# : L'utilisation d'un verrou bloque les appels ultérieurs.

En utilisant le verrou, je sais que s'il y a un appel ultérieur, celui-ci attendra la fin de l'appel précédent. Que se passe-t-il si je ne veux pas que l'appel suivant attende et qu'il saute ce bloc de code ?

Je crée actuellement un clavier sur un périphérique qui écoute les entrées d'autres périphériques. J'ai un timer qui vérifie l'entrée du périphérique dans 500millisecondes.

keyboardTimer = new Timer(500);
            keyboardTimer.Elapsed += (sender, e) =>
            {  
                lock (RemoteControlPage.keyboardLock)
                { 
                    var keyboardStatus = LauncherClient.Instance.GetKeyboardStatus();

                    if (keyboardStatus.Visibility == KEYBOARDVISIBILITY.SHOW)
                    { 
                        //Show keyboard
                    }
                    else if (keyboardStatus.Visibility == KEYBOARDVISIBILITY.HIDE)
                    {
                        //Hide keyboard 
                    }
                    else {
                        Debug.WriteLine("Keyboard = Do Nothing");
                    }
                }
            }; 

Dans le code, je dispose d'un verrou au cas où deux personnes ou plus appelleraient à le saisir à chaque fois. Elapsed se déclenchera à nouveau même si l'appel précédent n'a pas terminé le traitement, ce qui entraîne l'attente de l'appel suivant. Existe-t-il un moyen de sauter l'exécution au lieu d'attendre que l'appel précédent ait fini d'être traité ?

3voto

InBetween Points 6162

Vous pouvez utiliser le Monitor classe :

keyboardTimer = new Timer(500);
keyboardTimer.Elapsed += (sender, e) =>
{  
    if (Monitor.TryEnter(RemoteControlPage.keyboardLock))
    { 
        try
        {
            var keyboardStatus = LauncherClient.Instance.GetKeyboardStatus();

            if (keyboardStatus.Visibility == KEYBOARDVISIBILITY.SHOW)
            { 
                //Show keyboard
            }
            else if (keyboardStatus.Visibility == KEYBOARDVISIBILITY.HIDE)
            {
                //Hide keyboard 
            }
            else
            {
                Debug.WriteLine("Keyboard = Do Nothing");
            }
        }
        finally
        {
            Monitor.Exit(RemoteControlPage.keyboardLock);
        }
    }
 };

-1voto

spender Points 51307

Toute cette histoire de synchronisation est difficile à mettre en œuvre. Si vous ne voulez pas réintroduire des données d'une manière très claire et facilement compréhensible, optez simplement pour une boucle asynchrone :

async Task CheckKeyboard(CancellationToken token = default(CancellationToken))
{
     while(!token.IsCancellationRequested)
     {
         //talk to the keyboard
         await Task.Delay(500); //or some cunningly figured out wait time
     }
}

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