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

c# – 在.NET 4中实现RegEx超时,第1张

概述平台:Silverlight 4,.NET 4 使用.NET 4.5 Developer预览版,RegEx类已得到增强,允许设置Timeout值,如果模式匹配存在问题,将阻止RegEx引擎挂起UI. 请求在.NET 4 Silverlight应用程序中实现类似功能的建议. 提前致谢. 通用示例: public static R WithTimeout<R>(Func<R> proc, int du 平台:Silverlight 4,.NET 4

使用.NET 4.5 Developer预览版,RegEx类已得到增强,允许设置Timeout值,如果模式匹配存在问题,将阻止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超时全部内容,希望文章能够帮你解决c# – 在.NET 4中实现RegEx超时所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1242533.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存