Saltar al contenido

Implementando un tiempo de espera en C#

este problema se puede resolver de diversas maneras, pero nosotros te damos la respuesta más completa para nosotros.

Solución:

Una forma posible sería:

Stopwatch sw = new Stopwatch();
sw.Start();

while(true)

    tryMethod();
    if(sw.ElapsedMilliseconds > 5000) throw new TimeoutException();

Sin embargo, actualmente no tiene forma de salir de su ciclo. recomendaría tener tryMethod devolver un bool y cambiarlo a:

Stopwatch sw = new Stopwatch();
sw.Start();

while(!tryMethod())

    if(sw.ElapsedMilliseconds > 5000) throw new TimeoutException();

Creo que podría hacer esto con un temporizador y un delegado, mi código de ejemplo está a continuación:

using System;
using System.Timers;

class Program

    public delegate void tm();

    static void Main(string[] args)
    
        var t = new tm(tryMethod);
        var timer = new Timer();
        timer.Interval = 5000;

        timer.Start();

        timer.Elapsed += (sender, e) => timer_Elapsed(t);
        t.BeginInvoke(null, null);
    

    static void timer_Elapsed(tm p)
    
        p.EndInvoke(null);
        throw new TimeoutException();
    

    static void tryMethod()
    
        Console.WriteLine("FooBar");
    

Tiene tryMethod, luego crea un delegado y apunta este delegado a tryMethod, luego inicia este delegado de forma asíncrona. Luego tiene un temporizador, con un intervalo de 5000 ms, pasa su delegado a su método de tiempo transcurrido (que debería funcionar como un delegado es un tipo de referencia, no un tipo de valor) y una vez que han transcurrido los 5000 segundos, llama a EndInvoke método en su delegado.

Siempre que tryMethod() no bloquee, esto debería hacer lo que quieras:

No es seguro para el horario de verano o el cambio de zona horaria cuando se está en movimiento:

DateTime startTime = DateTime.Now;

while(true)

    tryMethod();
    if(DateTime.Now.Subtract(startTime).TotalMilliseconds > 5000)
        throw new TimeoutException();

Versiones seguras de zona horaria y horario de verano:

DateTime startTime = DateTime.UtcNow;

while(true)

    tryMethod();
    if(DateTime.UtcNow.Subtract(startTime).TotalMilliseconds > 5000)
        throw new TimeoutException();
 

(Se requiere .NET 3.5 o superior para DateTimeOffset).

DateTimeOffset startTime = DateTimeOffset.Now;

while(true)

    tryMethod();
    if(DateTimeOffset.Now.Subtract(startTime).TotalMilliseconds > 5000)
        throw new TimeoutException();
 

Recuerda que tienes permiso de parafrasear si atinaste tu asunto en el momento justo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *