平台: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; }
更新:
修复了上面的代码段以正确处理异常.
原文地址:https://www.jb51.cc/csharp/98941.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。