web-dev-qa-db-fra.com

c # attendez un moment sans bloquer

Je souhaite que ma méthode attend environ 500 ms, puis vérifie si un indicateur a changé. Comment compléter ceci sans bloquer le reste de ma candidature?

17
santBart

Thread.Sleep(500) va forcer le thread actuel à attendre 500ms. Cela fonctionne, mais ce n'est pas ce que vous voulez si votre application entière s'exécute sur un seul thread.

Dans ce cas, vous voudrez utiliser une Timer, comme ceci:

using System.Timers;

void Main()
{
    Timer t = new Timer();
    t.Interval = 500; // In milliseconds
    t.AutoReset = false; // Stops it from repeating
    t.Elapsed += new ElapsedEventHandler(TimerElapsed);
    t.Start();
}

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Hello, world!");
}

Vous pouvez définir AutoReset sur true (ou ne pas le définir du tout) si vous souhaitez que le temporisateur se répète.

30
Toneo

Je ne comprends pas vraiment la question.

Si vous voulez bloquer avant de vérifier, utilisez Thread.Sleep(500);

Si vous souhaitez vérifier de manière asynchrone toutes les x secondes, vous pouvez utiliser un Timer pour exécuter un gestionnaire toutes les x millisecondes.

Cela ne bloquera pas votre thread actuel.

7
Tudor

Vous pouvez utiliser await Task.Delay(500); sans bloquer le thread comme le fait Sleep, et avec beaucoup moins de code qu'un minuteur.

6
MarkovskI

Si la méthode en question s’exécute sur un autre thread que le reste de votre application, procédez comme suit:

Thread.Sleep(500);
5
Phil Klein
System.Threading.Thread.Sleep(500);

Mettre à jour

Cela ne bloquera pas le reste de votre application, mais uniquement le thread qui exécute votre méthode.

2
danludwig

Utiliser une minuterie devrait faire l'affaire

si vous avez besoin d'utiliser un fil, voici un exemple

void Main()
{
    System.Threading.Thread check= new System.Threading.Thread(CheckMethod);
    check.Start();
}

private void CheckMethod()
{
     //Code
     Thread.Sleep(500);
}
0
Captain overflow

Tâche asynchrone:

 var task = new Task (() => function_test()); task.Start();

public void function_test() { `Wait for 5000 miliseconds`   Task.Delay(5000);` }
0
gimpy