ejemplo genérico:
public static R WithTimeout<R>(Func<R> proc, int duration)
{
var wh = proc.BeginInvoke(null, null);
if (wh.AsyncWaitHandle.WaitOne(duration))
{
return proc.EndInvoke(wh);
}
throw new TimeOutException();
}
Uso:
var r = WithTimeout(() => regex.Match(foo), 1000);
Actualización:
Como ha señalado Christian.K, el hilo asíncrono será aún continúan en ejecución .
Aquí es uno donde el hilo terminará:
public static R WithTimeout<R>(Func<R> proc, int duration)
{
var reset = new AutoResetEvent(false);
var r = default(R);
Exception ex = null;
var t = new Thread(() =>
{
try
{
r = proc();
}
catch (Exception e)
{
ex = e;
}
reset.Set();
});
t.Start();
// not sure if this is really needed in general
while (t.ThreadState != ThreadState.Running)
{
Thread.Sleep(0);
}
if (!reset.WaitOne(duration))
{
t.Abort();
throw new TimeoutException();
}
if (ex != null)
{
throw ex;
}
return r;
}
Actualización:
fija por encima de fragmento de tratar correctamente con excepciones.
Véase también esta respuesta usando la tarea: http://stackoverflow.com/a/13526507/492 ... No sé si funciona en Silverlight. –