平时写异步同步较少,最近毕业设计使用的WPF开发一个基于百度人脸识别的签到系统
在开发过程中,遇到【人脸识别】,【人脸注册】,【人脸检测】的地方就容易出现多次无用执行或者UI卡死的情况
使用人脸签到过程是:
(timer一直执行)
从摄像头控件得到图像->将图片转成base64编码->人脸检测->检测到人脸->人脸识别->根据获取到的id进行签到
如果检测和识别是异步在运行(自己写的await Task.Run.........),所以会出现这种情况:一旦人脸签到网络慢,他就自己到一边去异步执行了,信息都没获取到,当timer又执行一次的时候,又开始了签到,所以常常会出现签到几次的情况)
我又把异步改成了同步,UI线程就卡死了。。。。。
下面是没有异步和同步的部分代码还没有加入timer:
public static string base64IMG = "";//base64编码
public EmployeeBLL employeeBLL = new EmployeeBLL();//员工bll
public FaceBLL faceBLL = new FaceBLL();//百度人脸BLL
public Newtonsoft.Json.Linq.JObject GetFaceInfo()//百度检测人脸
{
return faceBLL.CheckFace(base64IMG);
}
//百度人脸获取ID
public string GetFaceID()
{
return faceBLL.SearchId(base64IMG, "User");
}
public void CheckFace()//检测人脸
{
base64IMG = aceAdd.GetCameraImg();//获取摄像头图像
var info = GetFaceInfo();//获取图像信息
if (Convert.ToInt32(info["error_code"]) == 0)//识别到人了!
{
var id = GetFaceID();//根据图像在百度查询id
if (id != null)//识别到数据库中有id的人了!
{
employeeBLL.SignById(id);//签到!
Employee result = employeeBLL.GetEmployeeById(id);//根据ID拿到人了!
MessageBox.Show("签到成功!!", "欢迎您 " + result.Ename + " 本次是第" + result.EattendanceTimes + "次签到");
}
}
}
不知道大佬们有什么好的解决办法教教我,不胜感激
异步处理
思路有问题,签到这种一个定时周期内的图片视作同一人的,有一个成功,其他的的直接取消。签到记录要查重
后来自己研究了一下 和您回答的是一样的使用异步。在一段时间内,同一个人如果重复检测到会查询数据库签到时间是否间隔太短,会提示:未到下次签到时间。
用异步,应该是 Timer 回调函数的写法有问题
给你的异步设置一个超时时间,网络有返回或超时后再运行一次计时器