WPF C#异步多线问题程求解

2019-05-22 12:02发布

问题:

平时写异步同步较少,最近毕业设计使用的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 + "次签到");
                }
            }
        }

不知道大佬们有什么好的解决办法教教我,不胜感激

回答1:

异步处理
思路有问题,签到这种一个定时周期内的图片视作同一人的,有一个成功,其他的的直接取消。签到记录要查重



回答2:

用异步,应该是 Timer 回调函数的写法有问题



回答3:

给你的异步设置一个超时时间,网络有返回或超时后再运行一次计时器