`
liubogod
  • 浏览: 8702 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解决等待超时问题

阅读更多
应用多线程:解决等待超时问题
作者:天涯 来源:中国自学编程网 发布日期:1221095373 

我们日常工作中常会遇到这种场景:数据库、远程webservice、串口设备等等连接失败,或其他需要长时间等待才能返回错误信息的情况。这时我们需要设定一个超时时间如果出现问题能够及时反馈给用户。虽然我们给数据库或webservice把超时设定很短,但这样做不灵活因为有些操作本身就是很耗时的。因此我们应该利用多线程来解决这个问题。

其实这个问题很好解决,会超时的操作用异步执行(异步委托或者线程池),用户主线程进行等待通知(ManualResetEvent)。如果用户在超时时间能都没等到就会激发超时事件通知用户。看代码吧一目了然:
public class TimeoutChecker
{
long _timeout; //超时时间
Action _proc; //会超时的代码
Action _procHandle; //处理超时
Action _timeoutHandle; //超时后处理事件
ManualResetEvent _event = new ManualResetEvent(false);

public TimeoutChecker(Action proc, Action timeoutHandle)
{
this._proc = proc;
this._timeoutHandle = timeoutHandle;
this._procHandle = delegate
{
//计算代码执行的时间
Stopwatch sw = new Stopwatch();
sw.Start();
if (this._proc != null)
this._proc();
sw.Stop();
//如果执行时间小于超时时间则通知用户线程
if (sw.ElapsedMilliseconds < this._timeout && this._event != null)
{
this._event.Set();
}
};
}
public bool Wait(long timeout)
{
this._timeout = timeout;
//异步执行
this._procHandle.BeginInvoke(null, null);
//如果在规定时间内没等到通知则为false
bool flag = this._event.WaitOne((int)timeout, false);
if (!flag)
{
//触发超时时间
if (this._timeoutHandle != null)
this._timeoutHandle();
}
this.Dispose();
return flag;
}
private void Dispose()
{
if(this._event != null)
this._event.Close();
this._event = null;
this._proc = null;
this._procHandle = null;
this._timeoutHandle = null;
}
}
代码很简单,下面是调用例子

TimeoutChecker we = new TimeoutChecker(delegate
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "server=.;database=test;uid=sa;pwd=s";
conn.Open();
}}, delegate { Console.WriteLine("数据库不存在"); });
if (we.Wait(200))
Console.WriteLine("链接成功");
是不是很方便啊。 
分享到:
评论

相关推荐

    解决MySQL 5数据库连接超时问题

    mysql5将其连接的等待时间(wait_timeout)缺省为8小时。怎么不让它超时呢

    OpenNETCF.Desktop.Communication.dll(已经解决连接超时问题)

    解决原来的 OpenNETCF.Desktop.Communication.dll 组件的问题,当设备没有与计算机连接,调用组件方法时传入的超时参数不起作用程序会一直等待下去。所上传组件本人已经解决了这个问题。

    Sql Server 数据库超时问题的解决方法

    Sql server 2000 的等待响应时间

    Android Studio4.0解决Gradle下载超时问题

    问题描述 当引入或者新建一个项目的时候,在引入gradle版本号的时候会报连接超时的错误:Gradle sync failed: Connection timed out: connect. If you are behind an HTTP········ 解决方法 一、更改项目中...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    Linux内核超时导致虚拟机无法正常启动问题及解决方案1

    child_rip+0x0/0x20上述报错描述了系统任务在等待IO超过120秒以后, 依旧没有得到响应,导致该任务被阻止. IO超时未响应的原因, 有多种:

    delphi DataSnap连接超时设置无效补丁

    解决问题:delphi D10下(XE8\XE7),DataSnap连接超时设置在android中使用无效,导致不能连接服务器时长时间等待。补丁包带源码及说明。 Datasnap ConnectTimeout android

    PHP进行批量任务处理不超时的解决方法

    本文实例分析了PHP进行批量任务处理不超时的解决方法。分享给大家供大家参考,具体如下: PHP批量任务处理 PHP在批量处理任务的时候会超时,其实解决方法很简单了,就是把任务分割,一次处理一部分,任务进度可以放在...

    Http请求长时间等待无结果返回解决办法

    分析了下程序,写了个测试,本地跑依旧长时间等待,无法运行,也不抛出异常,最后发现问题在于发送请求的部分,一直在等待对方服务器响应,由于采用的是keep-alive方式的连接,这里没有采用超时的方式,以至于程序...

    WinForm C#多线程等待窗体

    由于用到了非托管资源,最简单的方式是把托管资源(WaitForm)放在工作线程,线程结束,窗体会自动销毁,不用自己写清理代码。 ShowDialog自动阻塞当前线程,这使它成为最优的解决方式。

    php中curl和soap方式请求服务超时问题的解决

    本篇文章主要介绍了php中curl和soap方式请求服务超时问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    PyQt5中多线程模块QThread和线程池ThreadPoolExecutor解决PyQt5界面程序执行比较耗时操作无响应问题

    1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...

    Python中实现输入超时及如何通过变量获取变量名

    解决思路 – 多线程法 我就想到了用多线程的方式, 开启一个子线程用stdin(比如python的input函数)获取用户输入, 主线程里设置线程启动和超时. 创建线程 Python中使用多线程很方便, threading.Threaded(函数, 参数...

    该如何解决MySQL中的死锁问题.txt

    解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB...

    程序员面试宝典java篇.zip

    1.停止等待协议 ...停止等待协议会出现死锁现象(A等待B的确认),解决办法,启动超时计时器,超时计时器有一个重传时间。重传时间一般选择略大于“正常情况下从发完数据帧到收到确认帧所需的平均时间”。

    the-ultimate-guide-to-ruby-timeouts:流行的Ruby宝石超时

    解决-解决优化问题的时间 语句超时 对于许多应用程序而言,最重要的一件事情(如果您使用关系数据库) 宝石 资料储存库 HTTP客户端 指令 网络服务器 机架中间件 解算器 分布式锁 第三方服务 GitLab 其他 语句超时...

    线程任务后台处理

    大数据保存时会存在线程等待,只有全部保存后才能往下执行,使用线程委托任务让流程先走完,数据慢慢保存,提高页面响应速度

    操作系统实训报告

    (3)修改EOS信号量的实现代码,使之支持等待超时唤醒和批量释放功能。 2 完成的实验内容 2.1 使用EOS的信号量实现生产者-消费者问题 (简要说明使用EOS的信号量解决生产者-消费者问题的实现方法;给出在本...

    腾讯云微信小程序一站式解决方案.rar

    腾讯云微信小程序一站式解决方案源码,里面包括了群聊的实现,信道状态枚举,断线重连最多尝试 5 次,每次重连前,等待时间的增量值,等确认微信小程序全面支持 ES6 就不用那么麻烦了。  这里包括了消息发送和接收,...

    开启OCSP提升https证书验证效率解决Let’s Encrypt SSL证书访问慢的问题

    请教了几位大神如何解决HTTPS证书验证超时的问题.给出的解决方案是要么换证书商,要么开启OCSP。 我这种穷人哪用得起大厂的HTTPS证书呀,只能采用第二种方案,开始OCSP。 如果网站部署了免费的Let’s Encrypt证书时...

Global site tag (gtag.js) - Google Analytics