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.