现在做一个考勤程序,命令行或者服务的方式一直在运行。
中控的设备,开发包支持实时事件。
在windows程序方式都正常, 但是命令行或者服务方式就有问题了。现在问题是,  如何实现空等待而又不影响事件的调用?
windows程序本身是在等待消息,不影响事件的触发, 但是命令行或服务的话,线程一sleep好像控件的事件响应就失效了。

解决方案 »

  1.   

    可以这样写:
                Console.WriteLine();
                Console.WriteLine("系统已经进入控制台Pending状态(按Ctrl+C键关闭进程)........");
                Console.WriteLine();
                var mh = new ManualResetEvent(false);
                Console.CancelKeyPress += (s, e) => mh.Set();
                while (!mh.WaitOne(TimeSpan.FromSeconds(60)))
                    每一分钟执行一次你自己的其它方法();
      

  2.   

    还是贴个代码吧,情况不太一样,事件是外部触发的
    这个程序里connected能正常触发,但是AttTransactionEx 怎么也触发不了。 窗口模式下是好好的。static Thread threadRun;
            static ZKControl m_control;
            static void Main(string[] args)
            {
                threadRun = new Thread(new ThreadStart(ThreadRun));
                threadRun.Start();
            }        protected static void ThreadRun()
            {            //读取配置文件
                m_control = new ZKControl();
                //m_control.OnAttTransactionEx += new ZKControl.AttTransactionExHandler(AttTransactionEx);
                m_control.OnAttTransactionEx += AttTransactionEx;
                m_control.OnConnected += Connected;            m_control.LogLocal("服务启动");
                m_control.LogDatabase("服务启动", "消息");
                while (!m_control.Connect())
                {                //连接
                    //if () //未连接
                    {
                        m_control.GetLastError();
                        m_control.LogDatabase("无法连接设备", "连接错误");
                        m_control.LogLocal("无法连接设备");
                        Thread.Sleep(5000); //5秒后重试
                        continue;
                    }
                }
                //连接
                m_control.Connect();
                //注册事件
                m_control.RegEvents();            while (true)//!!!
                {                Console.ReadKey();
                }
            }        public static void AttTransactionEx(string sUserID, int iAttState, DateTime dtActionTime)
            {
                 m_control.LogLocal("认证触发:" + sUserID + "状态" + iAttState.ToString() + "at " + dtActionTime.ToString());
                Console.WriteLine("认证触发");
            }
            public static void Connected()
            {
                m_control.LogLocal("已连接设备");
                Console.WriteLine("已连接");
            }    }
      

  3.   

    改成       
    m_control.OnAttTransactionEx += (s, e,t) => mh.Set();
                while (!mh.WaitOne(TimeSpan.FromSeconds(10)))
                {
                    Console.Write(".");
                    continue;
                }
    也不行啊。
    => 操作符还没见过...
      

  4.   

    学习了Lambda 表达式。
    又试了几种方式也不行。
    现在问题是使用 wait handle的话需要两个线程才行, 现在是在这个线程里创建的控件,在同一个线程里阻止等待的时候应该收不到事件的吧。 
    但是再建个线程还是同样的问题, 线程要么循环,要么退出,要么等待,等待还是会阻止事件...
      

  5.   

    Pending行为应该放在你得Main里,是主线程的。唉,这个想不到么?我真是有点高估了你哦,小同学。
      

  6.   

    你的控制台主线程,立刻就结束了,所以需要Pending。对吧?这个不用你动脑其实就应该想到,你是在主线程这里最后一点语句之后让其Pending的,而不是什么子线程。而至于你写子线程代码,我其实一直不太愿意看。实在是比较纠结。我就告诉你顶多写 
            protected static void ThreadRun()
            {
                m_control = new ZKControl();
                m_control.OnAttTransactionEx += AttTransactionEx;
                m_control.OnConnected += Connected;
                m_control.LogLocal("服务启动");
                m_control.LogDatabase("服务启动", "消息");
                var cnt = 0;
                while (!m_control.Connect() && cnt++ < 20)
                {
                        m_control.GetLastError();
                        m_control.LogDatabase("无法连接设备", "连接错误");
                        m_control.LogLocal("无法连接设备");
                        Thread.Sleep(5000); //5秒后重试
                        continue;
                }
                m_control.RegEvents();
            }
     
    就行了。你以为子线程需要循环?子线程不过是注册几个事件处理程序,注册完了就可以结束了。