|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。办理|正则 在c#中利用正则表达式举行婚配,偶然候我们会碰到这类情形,cpu利用率100%,可是正则表达式并没有非常抛出,正则一向处于婚配过程当中,这将招致体系资本被耗尽,使用程序被卡住,这是因为正则不完整婚配,并且Regex中没有Timeout属性,使正则处置器堕入了逝世轮回。
这类情形特别大概产生在对非牢靠的被婚配工具的婚配过程当中,比方在我的团体网站www.eahan.com项目中,对多个网站页面的主动收罗婚配,就常常产生该成绩。为了不资本耗尽的情形产生,我写了一个AsynchronousRegex类,望文生义,异步的Regex。给该类一个设置一个Timeout属性,将Regex婚配的举措置于独自的线程中,AsynchronousRegex监控Regex婚配凌驾Timeout限制时烧毁线程。
usingSystem;
usingSystem.Text.RegularExpressions;
usingSystem.Threading;
namespaceLZT.Eahan.Common
{
publicclassAsynchronousRegex
{
privateMatchCollectionmc;
privateint_timeout;//最长休眠工夫(超时),毫秒
privateintsleepCounter;
privateintsleepInterval;//休眠距离,毫秒
privatebool_isTimeout;
publicboolIsTimeout
{
get{returnthis._isTimeout;}
}
publicAsynchronousRegex(inttimeout)
{
this._timeout=timeout;
this.sleepCounter=0;
this.sleepInterval=100;
this._isTimeout=false;
this.mc=null;
}
publicMatchCollectionMatchs(Regexregex,stringinput)
{
Regr=newReg(regex,input);
r.OnMatchComplete+=newReg.MatchCompleteHandler(this.MatchCompleteHandler);
Threadt=newThread(newThreadStart(r.Matchs));
t.Start();
this.Sleep(t);
t=null;
returnmc;
}
privatevoidSleep(Threadt)
{
if(t!=null&&t.IsAlive)
{
Thread.Sleep(TimeSpan.FromMilliseconds(this.sleepInterval));
this.sleepCounter++;
if(this.sleepCounter*this.sleepInterval>=this._timeout)
{
t.Abort();
this._isTimeout=true;
}
else
{
this.Sleep(t);
}
}
}
privatevoidMatchCompleteHandler(MatchCollectionmc)
{
this.mc=mc;
}
classReg
{
internaldelegatevoidMatchCompleteHandler(MatchCollectionmc);
internaleventMatchCompleteHandlerOnMatchComplete;
publicReg(Regexregex,stringinput)
{
this._regex=regex;
this._input=input;
}
privatestring_input;
publicstringInput
{
get{returnthis._input;}
set{this._input=value;}
}
privateRegex_regex;
publicRegexRegex
{
get{returnthis._regex;}
set{this._regex=value;}
}
internalvoidMatchs()
{
MatchCollectionmc=this._regex.Matches(this._input);
if(mc!=null&&mc.Count>0)//这里有大概形成cpu资本耗尽
{
this.OnMatchComplete(mc);
}
}
}
}
}
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。 |
|