2013-04-14 9 views
15

Hallo Einfrieren Ich versuche, eine Methode des Wartens eine Anzahl von Millisekunden zu finden, bevor die nächste Zeile des Codes bewegen,Warten auf n Sekunden, dann nächste Codezeile ohne Form

Ich habe in Thread.Sleep sah aber das wird das Hauptformular einfrieren, ich möchte das aktiv bleiben.

Ich habe Timer und Stoppuhren versucht und beide frieren das Hauptformular ein, wenn sie auf einer Konsole gepostet werden sollen, wenn sie ankreuzen.

Ich konnte keinen Weg finden, task.delay oder Hintergrundarbeiter in der Wartezeit zu verwenden, die ich entweder wollte.

Pseudo-Code:

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

Die Methoden, die ich versucht habe einfach das Formular einfrieren und das Protokoll anschließend füllen, ich möchte nur eine einfache Methode des Wartens, ohne die Form Einfrieren und ohne mit Ereignissen umzugehen ist aufgerufen, was bedeuten würde, dass die nächste Zeile nicht ausgeführt wird.

Jede Hilfe wäre genial, weil ich C# noch neu bin und es ist ein bisschen verrückt :(

+0

Ist es WinForms oder WPF? – outcoldman

+0

Windows Form Anwendung – Sam

Antwort

25

Das await Schlüsselwort in Verbindung mit Task.Delay diese trivial macht.

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

Danke, das ist alles was ich brauchte, ich hatte versucht, die Aufgabe.Delay, aber ich war nicht bewusst, dass es in Verbindung mit "async Task" und "erwarten" – Sam

+3

@Sam Sie sicherlich nicht * müssen, zu ... haben. Sie könnten 'Task.Delay (2000) .ContinueWith (t => DoStuff(), ..., Task.Factory.FromCurrentSynchronizationContext());' stattdessen verwenden, woraufhin das 'await' es letztendlich in ein Refactor verwandelt. – Servy

+0

Das funktioniert super, also bin ich glücklich :) Danke nochmal! – Sam

3

driving me worden Versuchen Sie, eine DispatcherTimer verwenden. Es ist ein ziemlich praktisch-Objekt, das die ganze Arbeit an der Benutzeroberfläche delegieren Gewinde

zum Beispiel:..

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!"; 
} 
0

Timer sollte in diesem Fall gut funktionieren, es sei denn, Sie Thread.Sleep in seinen Handler oder der Handler selbst nimmt zu viel Zeit in Anspruch setzen

Sie haben das von Ihnen verwendete UI-Framework oder die .Net-Version nicht angegeben, aber für das neueste .NET können Sie async/await verwenden. Auf diese Weise würde UI nicht eingefroren werden, während der Code für die Hintergrundaufgabe erwartet

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