c# - usar - ¿Cómo disparo un método para ejecutar después de x segundos?
interrumpir proceso c# (4)
En el nivel de clase, defina una instancia de Timer
(hay algunas clases como esta; para una aplicación de winforms debe usar System.Windows.Forms.Timer
)
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
Luego, en su método, agregue líneas para manejar su tic y comenzarlo:
private void start_Vid_Click(object sender, EventArgs e)
{
if (video.State != StateFlags.Running)
{
viewport.Visible = true;
video.Play();
}
myTimer.Tick += (o,ea) => {
viewport.Visible = false;
viewport2.Visible = true;
pictureBox1.Visible = true;
start_Webc();
video2.Play();
myTimer.Stop();
}
myTimer.Interval = 5000; // 5 seconds
myTimer.Start();
}
Estoy trabajando en una aplicación C # Windows Forms donde necesito que el método se detenga durante 30 segundos hasta que continúe con la siguiente línea de código. He intentado Thread.Sleep()
que no era adecuado para esta aplicación y he entendido que debería usar algún tipo de temporizador en su lugar. He buscado mucho, pero no puedo encontrar la manera de implementar temporizadores.
Mi código está debajo y podría alguien mostrarme cómo debo implementar el temporizador. Hice un comentario sobre dónde quiero que el método se detenga.
private void start_Vid_Click(object sender, EventArgs e)
{
if (video.State != StateFlags.Running)
{
viewport.Visible = true;
video.Play();
}
//Here I want to wait 30 seconds until the next line of code is triggered
viewport.Visible = false;
viewport2.Visible = true;
pictureBox1.Visible = true;
start_Webc();
video2.Play();
}
Si su aplicación es una aplicación .Net 4.5, entonces es algo más fácil de usar Task
:
private async void start_Vid_Click(object sender, EventArgs e)
{
if (video.State != StateFlags.Running)
{
viewport.Visible = true;
video.Play();
}
await Task.Delay(TimeSpan.FromSeconds(30));
viewport.Visible = false;
viewport2.Visible = true;
pictureBox1.Visible = true;
start_Webc();
video2.Play();
}
También habría una manera con las extensiones reactivas:
Observable.Return("Delayed").Delay(TimeSpan.FromSeconds(30)).Subscribe(val => Console.WriteLine("Executing delayed"));
Task.Delay no está disponible en .NET 4.0, pero puede iniciar la tarea, que solo durará 30 segundos, y luego puede continuar con el subproceso de UI nuevamente:
Task.Factory.StartNew(() => Thread.Sleep(30 * 1000))
.ContinueWith((t) =>
{
viewport.Visible = false;
viewport2.Visible = true;
pictureBox1.Visible = true;
start_Webc();
video2.Play();
}, TaskScheduler.FromCurrentSynchronizationContext());