El código debe ejecutarse una vez después de un breve retraso

Tengo este Timer :

 Timer delayTimer = new Timer(); delayTimer.Interval = 500; delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => { Console.WriteLine("test"); textInputDialog.Show(); delayTimer.Stop(); }; delayTimer.Start(); 

Aquí tengo los siguientes problemas:

  • El timer nunca se detiene. El código se ejecuta cada 500 ms.
  • textInputDialog.Show(); no funciona (tal vez la causa del problema anterior)

¿Qué hay de malo en mi código?

Soluciones alternativas:

Esta es una alternativa al timer como mencionó Jens Horstmann. Y esto se llama en el subprocess de interfaz de usuario:

 private async Task SendWithDelay() { await Task.Delay(500); textInputDialog.Show(); } 

Otra alternativa sería NSTimer :

 NSTimer.CreateScheduledTimer(new TimeSpan(0,0,0,0,500), delegate { textInputDialog.Show(); }); 

Y para invocar una llamada en el subprocess de interfaz de usuario, puede usar InvokeOnMainThread :

 Timer delayTimer = new Timer(); delayTimer.Interval = 500; delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => { delayTimer.Stop(); Console.WriteLine("test"); InvokeOnMainThread (() => { textInputDialog.Show(); }); }; delayTimer.Start(); 

Detenga el timer antes de mostrar el cuadro de dialog:

 delayTimer.Elapsed += (object sender, ElapsedEventArgs e) => { delayTimer.Stop(); Console.WriteLine("test"); textInputDialog.Show(); }; 

También es probable que haya utilizado el timer incorrecto. No use System.Threading.Timer o System.Timers porque esto implica multihilo que no funciona bien con winforms o WPF. (Esta es probablemente la razón por la que su MessageBox no se muestra, se llama en el hilo incorrecto)

En WPF debe usar System.Windows.Threading.DispatcherTimer

Editar

En Winforms debería usar System.Windows.Forms.Timer (ver comentarios)

Aquí hay una solución sin async / await

También cabe en una sola statement, que es bastante elegante.
Esta es una C #, solución multiplataforma para realizar una acción después de un retraso. También funciona para una tarea recurrente.

 using System.Threading; var delayTimer = new Timer((state) => // Create timer, forget about it InvokeOnMainThread(() => // Fire on main thread textInputDialog.Show() // Your code goes here ), null, // Ignore the state 5 * 1000, // 5 seconds until the 1st fire Timeout.Infinite); // Do not repeat 

Algo como esto funcionó para mí:

  private async Task DelayedShow() { await Task.Delay(500); await _loadPop.textInputDialog.Show(); } 

Recuerde llamar al método de esta manera:

  BeginInvokeOnMainThread(() => DelayedShow());