在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资源问题以及解决方法的详细内容...