现在做一个考勤程序,命令行或者服务的方式一直在运行。
中控的设备,开发包支持实时事件。
在windows程序方式都正常, 但是命令行或者服务方式就有问题了。现在问题是, 如何实现空等待而又不影响事件的调用?
windows程序本身是在等待消息,不影响事件的触发, 但是命令行或服务的话,线程一sleep好像控件的事件响应就失效了。
中控的设备,开发包支持实时事件。
在windows程序方式都正常, 但是命令行或者服务方式就有问题了。现在问题是, 如何实现空等待而又不影响事件的调用?
windows程序本身是在等待消息,不影响事件的触发, 但是命令行或服务的话,线程一sleep好像控件的事件响应就失效了。
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)))
每一分钟执行一次你自己的其它方法();
这个程序里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("已连接");
} }
m_control.OnAttTransactionEx += (s, e,t) => mh.Set();
while (!mh.WaitOne(TimeSpan.FromSeconds(10)))
{
Console.Write(".");
continue;
}
也不行啊。
=> 操作符还没见过...
又试了几种方式也不行。
现在问题是使用 wait handle的话需要两个线程才行, 现在是在这个线程里创建的控件,在同一个线程里阻止等待的时候应该收不到事件的吧。
但是再建个线程还是同样的问题, 线程要么循环,要么退出,要么等待,等待还是会阻止事件...
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();
}
就行了。你以为子线程需要循环?子线程不过是注册几个事件处理程序,注册完了就可以结束了。