• 正则匹配超时处理


    使用正则匹配比较大的数据时就会发生程序超时并没有异常弹出,而且电脑cpu会到达100%

    在.Net4.5中微软有改进的方法,直接调用很方便,但.Net4.5以下就没有,下面写下自己找的处理方法

    1、.Net4.5中:  

    Regex reg = new Regex(正则, RegexOptions.IgnoreCase, TimeSpan.FromSeconds(2));

    TimeSpan.FromSeconds就是设置的超时时间,如超过就返回为空,FromSeconds=2是秒,也可以设置分钟小时

    2、.Net4.0中:

    复制代码
     1 /// <summary>
     2         /// 正则解析
     3         /// </summary>
     4         /// <param name="regex">正则对象</param>
     5         /// <param name="input">需要解析的字符串</param>
     6         /// <param name="OutTimeMilliseconds">超时时间</param>
     7         /// <returns></returns>
     8         public static MatchCollection Matchs(Regex regex, string input, int OutTimeMilliseconds)
     9         {
    10             MatchCollection mc = null;
    11             AutoResetEvent are = new AutoResetEvent(false);
    12             Thread t = new Thread(delegate()
    13             {
    14                 mc = regex.Matches(input);
    15                 //注意,在这里一定要把所有的匹配项遍历一次,不然的话当在此方法外遍历的话.也可能会出现等待情况
    16                 foreach (Match m in mc) { }
    17                 are.Set();
    18             });
    19             t.Start();
    20             Wait(t, TimeSpan.FromMilliseconds(OutTimeMilliseconds), are, null);
    21             return mc;
    22         }
    23 
    24         /// <summary>
    25         /// 等待方法执行完成,或超时
    26         /// </summary>
    27         /// <param name="t"></param>
    28         /// <param name="OutTime"></param>
    29         /// <param name="ares"></param>
    30         private static void Wait(Thread t, TimeSpan OutTime, WaitHandle are, WaitHandle cancelEvent)
    31         {
    32             WaitHandle[] ares;
    33             if (cancelEvent == null)
    34                 ares = new WaitHandle[] { are };
    35             else
    36                 ares = new WaitHandle[] { are, cancelEvent };
    37             int index = WaitHandle.WaitAny(ares, OutTime);
    38             if ((index != 0) && t.IsAlive)//如果不是执行完成的信号,并且,线程还在执行,那么,结束这个线程
    39             {
    40                 t.Abort();
    41                 t = null;
    42             }
    43         }
    44 
    45         /// <summary>
    46         /// 正则解析
    47         /// </summary>
    48         /// <param name="regex">正则对象</param>
    49         /// <param name="input">需要解析的字符串</param>
    50         /// <param name="OutTimeMilliseconds">超时时间</param>
    51         /// <returns></returns>
    52         public static Match Match(Regex regex, string input, int OutTimeMilliseconds)
    53         {
    54             Match m = null;
    55             AutoResetEvent are = new AutoResetEvent(false);
    56             Thread t = new Thread(delegate() { m = regex.Match(input); are.Set(); });
    57             t.Start();
    58             Wait(t, TimeSpan.FromMilliseconds(OutTimeMilliseconds), are, null);
    59             return m;
    60         }
    复制代码
  • 相关阅读:
    mkimage command not found
    Linux添加快捷启动方式 (Ubuntu Debian CentOS)
    CentOS下通过locale来设置字符集
    CentOS 安装中文输入法
    Centos 安装KScope1.6.2
    centos 配置NFS服务器
    Linux shell判断文件和文件夹是否存在
    数据库中Schema和Database有什么区别
    配置Tomcat使用https协议
    HTML font: 12px/1.5 Arial; 是什么意思
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/10335483.html
Copyright © 2020-2023  润新知