c# - 在 .NET 4 中实现 RegEx 超时

标签 c# .net regex silverlight timeout

平台: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/

相关文章:

c# - 日期时间上下舍入

Python 正则表达式命名捕获组

c# - 使用 mvc6 网格时无法将显示格式设置为小数点后两位

c# - GDI+ 无法保存 PNG C#

c# - 不同文化的 Umbraco 404 不工作

c# - 在 wpf 中为线条装饰器设置动画?

ios - AFNetworking 2.0,SOAP 网络服务 : how to make request?

.net - TeamCity - 未满足的要求 (DotNetFramework4.0_x86)

regex - 如何从文件中 grep 精确匹配特殊字符?

python - 从 python 中的以下字符串中提取值的最佳方法?