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?
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.
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.
Vous pouvez utiliser await Task.Delay(500);
sans bloquer le thread comme le fait Sleep
, et avec beaucoup moins de code qu'un minuteur.
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);
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.
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);
}
Tâche asynchrone:
var task = new Task (() => function_test()); task.Start();
public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` }