我有一系列代码块花了太长时间.它失败时我不需要任何技巧.事实上,我想在这些块花费太长时间时抛出异常,并且只是通过我们的标准错误处理而失败.我宁愿不为每个块创建方法(这是我到目前为止看到的唯一建议),因为它需要重新编写代码库.
下面是我LIKE如果可能创造.
public void MyMethod( ... ) { ... using (MyTimeoutObject mto = new MyTimeoutObject(new TimeSpan(0,0,30))) { // Everything in here must complete within the timespan // or mto will throw an exception. When the using block // disposes of mto, then the timer is disabled and // disaster is averted. } ... }
我使用Timer类创建了一个简单的对象.(注意那些喜欢复制/粘贴的人:这个代码不起作用!!)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; public class MyTimeoutObject : IDisposable { private Timer timer = null; public MyTimeoutObject (TimeSpan ts) { timer = new Timer(); timer.Elapsed += timer_Elapsed; timer.Interval = ts.TotalMilliseconds; timer.Start(); } void timer_Elapsed(object sender, ElapsedEventArgs e) { throw new TimeoutException("A code block has timed out."); } public void Dispose() { if (timer != null) { timer.Stop(); } } }
它不起作用,因为System.Timers.Timer类捕获,吸收和忽略在其中抛出的任何异常,正如我所发现的那样 - 击败了我的设计.在没有完全重新设计的情况下创建此类/功能的任何其他方式?
两个小时前这看起来很简单,但让我很头疼.