平台:Silverlight 4、.NET 4
使用 .NET 4.5 Developer 预览 RegEx类已得到增强,允许设置超时值,这将防止 RegEx 引擎在模式匹配出现问题时挂起 UI。
征求有关在 .NET 4 Silverlight 应用程序中实现类似功能的建议。
提前致谢。
最佳答案
通用示例:
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();
}
用法:
var r = WithTimeout(() => regex.Match(foo), 1000);
更新:
正如 Christian.K 所指出的,异步线程仍将继续运行。
这是线程将终止的地方:
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;
}
更新:
修复了上面的代码片段以正确处理异常。
关于c# - 在 .NET 4 中实现 RegEx 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460661/