C#中执行动作超时检测

public delegate void DoHandler();
    public class TimeoutLimit
    {
        private readonly ManualResetEvent _mTimeoutObject;
        private bool _timeout;
        public DoHandler Do;

        public TimeoutLimit()
        {
            _mTimeoutObject = new ManualResetEvent(true);
        }
        public bool DoWithTimeout(TimeSpan timeSpan)
        {
            if (Do == null)
            {
                return false;
            }
            _mTimeoutObject.Reset();
            _timeout = true;
            Do.BeginInvoke(DoAsyncCallBack, null);
            if (!_mTimeoutObject.WaitOne(timeSpan, false))
            {
                _timeout = true;
            }
            return _timeout;
        }
        private void DoAsyncCallBack(IAsyncResult result)
        {
            try
            {
                Do.EndInvoke(result);
                _timeout = false;
            }
            catch (Exception ex)
            {
                _timeout = true;
            }
            finally
            {
                _mTimeoutObject.Set();
            }
        }
    }

使用示例

//TimeoutLimit timeout = new TimeoutLimit { Do = Your Func };
//bool bo = timeout.TimeoutLimit(new TimeSpan(0, 0, 0, 1));
//if (bo) {Your Code}
时间: 2024-08-27 03:42:26

C#中执行动作超时检测的相关文章

网络编程中的超时检测

我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待.事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开.我们在程序中有必要对这种情况进行检测,从而及时做出响应.下面介绍几种常用的超时检测方法(假设我们要求通过套接字等待数据的最大时间为8秒): 一. 设置套接字接收超时 setsockopt可以设置套接字的属性,其中包括接收超时时间.参考代码如下        struct timeval tv; // 描述时间的结构体变量   

网络超时检测的三种方法

作者:于老师,华清远见嵌入式学院讲师. 网络通信中,很多操作会使得进程阻塞,这时我们要设定时间,到时间后强制返回,避免进程在没有数据的情况下无限阻塞 这里我们总结一下网络超时检测的三种方法: 通过setsockopt设置套接字属性SO_RCVTIMEO struct timeval t = {5, 0}           if  (setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)) == -1) {             

Cocos2d-x手机游戏开发中-组合动作

动作往往不是单一,而是复杂的组合.我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作.组合动作包括以下几类:顺序.并列.有限次数重复.无限次数重复.反动作和动画.动画我们会在下一节介绍,本节我们重点顺序.并列.有限次数重复.无限次数重复和反动 下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景. 下面我们再看看具体的程序

在 C# 中执行 msi 安装

有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义 msi 安装包的执行过程. 需求 比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品.当用户选择了三个产品时,如果分别显示这三个产品的安装交互 UI 显然是不恰当的.我们期望用一个统一的自定义 UI 去取代每个产品各自的 UI. 实现思路 平时使用 msiexec.exe 习惯了,所以最直接的想法就是在一个子进程中执行: msiexec.exe /qn 这样固然是能够完成任务,但是不是太简陋了? 安装开始后我们想取消这

Android-Service中执行新线程的几种方式

大家都知道,service和activity都是运行在UI线程中,超时的数据读取和网络耗时等操作必须新建线程,下面说说service中执行新线程的几种方式. 1.传统的java方式 我们都知道 java中新建线程可以继承Thread类,也可以implement Runnable接口.实质都是实现Runnable的run方法,此处底层应该是jvm识别run这个方法分配并且创建了线程.run方法只是准备好了新线程的资源,要调用 start() native方法才能启动线程. 1 public int

handler.post 为什么要将thread对象post到handler中执行呢?

转载网址:http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html在Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runnable对象安排这些任务.在javadoc中,对Handler是这样解释的:Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runna

网络超时检测方法

超时检测的必要性:避免进程在没有数据时无限制地阻塞,当设定的时间到时,进程从原操作返回继续运行. 方法(1):使用setsockopt函数 时间结构体 struct timeval  tv; 可设定 tv.tv_sec = 5; // 设置5秒时间 tv.tv_usec = 0; 然后设置超时选项 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 注意:将进程中和sockfd相关的阻塞,变为非阻塞. 实例代码: serve

zabbix触发器无法执行动作

遇到一个坑爹的问题,必须记录下来. 问题描述:监控的主机分为了多个组,用户专门建了一个用于接收报警的组,然而这个组成员只能接收某个主机的报警,而不能接收其他主机的报警(现在回想起来了,最后那几个组是新创建的). 排查的过程: 先让其触发一个告警,然后触发器没有执行动作,检查了报警媒介.触发器.动作,都没问题.奇怪-- 手动发送邮件测试也没问题,只能放大招了,重启zabbix_server,结果还是不行-- 只能放终极大招了,重启linux系统.还是不行-- 他大爷的,最后看了一下用户组,原来新建

c# webConfig中的session超时详细设置

webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 session超时奏效.我在做现在的程序的时候,就是这样,写sessionState的时候,按照如下的方式设置之后,session设置的 timeout时间不能够起作用:但是不用了一些属性之后,就能够起作用了. 服务器上发行后不能起作用的设置: <sessionState mode="InProc&