see - remarks c#
Espere n segundos, luego la siguiente línea de código sin congelar la forma (4)
El temporizador debería funcionar bien en este caso, a menos que coloque Thread.Sleep en su controlador o el controlador mismo tarde demasiado tiempo en completarse.
No ha especificado el marco de la interfaz de usuario que usa o la versión .Net, pero para la última versión de .Net puede usar async / await. De esa manera, la interfaz de usuario no se congelaría mientras su código espera la tarea en segundo plano
void async MyMethod()
{
var result = await Task.Run(() => long_running_code);
}
Hola, estoy tratando de encontrar un método para esperar varios milisegundos antes de pasar a la siguiente línea de código.
He investigado Thread.Sleep pero esto congelará el formulario principal, me gustaría que esto permanezca activo.
Probé los cronómetros y los cronómetros, y ambos congelan el formulario principal cuando deberían estar publicando en una consola cuando hacen tictac.
No pude encontrar una manera de usar task.delay o background worker en la espera que yo quisiera.
Pseudo Código:
Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.
Los métodos que he intentado simplemente congelan el formulario y luego llenan el registro. Solo quiero un método simple de espera sin congelar el formulario y sin tener que lidiar con los eventos que se llaman, lo que significa que no se ejecutará la siguiente línea.
Cualquier ayuda sería increíble porque todavía soy nuevo en c # y me está volviendo un poco loco :(
La palabra clave Task.Delay
, junto con Task.Delay
hace que esto sea trivial.
public async Task Foo()
{
await Task.Delay(2000);
txtConsole.AppendText("Waiting...");
DoStuff();
}
Trate de usar un DispatcherTimer . Es un objeto bastante útil que realiza todo el trabajo de delegación en el subproceso de la interfaz de usuario.
Por ejemplo:
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!";
}
DateTime Tthen = DateTime.Now;
do
{
Application.DoEvents();
} while (Tthen.AddSeconds(5) > DateTime.Now);