我和老米曾经讨论过等待超时的问题觉得是比较挺常用的代码,所以在这里和大家分享一下。我和老米的思路略有不同这里没有孰优孰略,只是习惯差异而已。
我们日常工作中常会遇到这种场景:数据库、远程webservice、串口设备等等连接失败,或其他需要长时间等待才能返回错误信息的情况。这时我们需要设定一个超时时间如果出现问题能够及时反馈给用户。虽然我们给数据库或webservice把超时设定很短,但这样做不灵活因为有些操作本身就是很耗时的。因此我们应该利用多线程来解决这个问题。
其实这个问题很好解决,会超时的操作用异步执行(异步委托或者线程池),用户主线程进行等待通知(ManualResetEvent)。如果用户在超时时间能都没等到就会激发超时事件通知用户。看代码吧一目了然:
- public class TimeoutChecker
- {
- long _timeout; //超时时间
- Action _proc; //会超时的代码
- Action _procHandle