好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#正则表达式引发的CPU资源问题以及解决方法

在C#中用正则表达式处理大文本时,某种条件会触发CPU高上去,而且会一直高居不下,只有回收应用程序池才能让CPU下去。当时怎么优化正则表达式也没有用,后来没办法,使用磁盘文件进行大量缓存,减少了触发这个问题的几率。

难道.NET在正则表达式处理上隐藏着不为人所知的坑?微软从.NET Framework 4.5开始给正则表达式增加了超时设置(matchTimeout),似乎验证了这一点。

解决方法一:给Markdow转换所用的所有正则表达式加上超时设置——TimeSpan.FromSeconds(1),如果某个正则表达式处理超过1秒就会引发异常,从而不让任何一只老鼠坏了一碗汤。

示例代码如下:

private static Regex _newlinesLeadingTrailing = 

    new Regex(@"^\n+|\n+\z", 

    RegexOptions.Compiled, 

    TimeSpan.FromSeconds(1));

但是,这样一个一个正则表达式进行修改,好麻烦!

于是有了“解决方法一”的改进版:

在Global.asax.cs中Application_Start添加如下的代码:

protected void Application_Start(object sender, EventArgs e)

{

    AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(1));

}

这样就可以全局设置所有正则表达式的默认超时时间。

查看更多关于C#正则表达式引发的CPU资源问题以及解决方法的详细内容...

  阅读:83次