web-dev-qa-db-fra.com

Attendez n secondes, puis la ligne de code suivante sans geler le formulaire

Bonjour, j'essaie de trouver une méthode pour attendre un certain nombre de millisecondes avant de passer à la ligne de code suivante,

J'ai regardé dans Thread.Sleep mais cela gèlera le formulaire principal, je voudrais que cela reste actif.

J'ai essayé les minuteries et les chronomètres et les deux gèlent le formulaire principal lorsqu'ils devraient être publiés sur une console lorsqu'ils cochent.

Je n'ai pas pu trouver un moyen d'utiliser task.delay ou background worker dans l'attente que je voulais non plus.

Pseudo code:

Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.

Les méthodes que j'ai essayées gèlent simplement le formulaire et remplissent le journal par la suite, je veux juste une méthode simple d'attente sans geler le formulaire et sans avoir à gérer les événements appelés, ce qui signifierait que la ligne suivante n'est pas exécutée.

Toute aide serait géniale car je suis encore nouveau sur c # et ça me rend un peu fou :(

17
Sam

Le mot clé await, conjointement avec Task.Delay rend cela trivial.

public async Task Foo()
{
    await Task.Delay(2000);
    txtConsole.AppendText("Waiting...");
    DoStuff();
}
27
Servy

Essayez d'utiliser un DispatcherTimer . C'est un objet assez pratique qui fait tout le travail de délégation au thread d'interface utilisateur.

Par exemple:

private DispatcherTimer _dtTimer = null;

public Constructor1(){
  _dtTimer = new DispatcherTimer();
  _dtTimer.Tick += new System.EventHandler(HandleTick);
  _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds
  _dtTimer.Start();
}

private void HandleTick(object sender, System.EventArgs e) {
  _uiTextBlock.Text = "Timer ticked!";
}
3
Daniel

La minuterie devrait fonctionner correctement dans ce cas, à moins que vous ne mettiez Thread.Sleep dans son gestionnaire ou que le gestionnaire lui-même prenne trop de temps.

Vous n'avez pas spécifié le cadre d'interface utilisateur que vous utilisez ou la version .Net, mais pour le dernier .Net, vous pouvez utiliser async/wait. De cette façon, l'interface utilisateur ne serait pas gelée pendant que votre code attend la tâche en arrière-plan

void async MyMethod()
{  
    var result = await Task.Run(() => long_running_code);
}
0
alex