首页新闻找找看学习计划

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

0
悬赏园豆:100 [已解决问题] 解决于 2019-05-22 12:20

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

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

大头BigHead的主页 大头BigHead | 初学一级 | 园豆:104
提问于:2019-05-08 14:33
< >
分享
最佳答案
0

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

收获园豆:60
前门后院 | 菜鸟二级 |园豆:264 | 2019-05-22 11:31

后来自己研究了一下 和您回答的是一样的使用异步。在一段时间内,同一个人如果重复检测到会查询数据库签到时间是否间隔太短,会提示:未到下次签到时间。

大头BigHead | 园豆:104 (初学一级) | 2019-05-22 12:19
其他回答(2)
0

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

收获园豆:20
dudu | 园豆:41322 (高人七级) | 2019-05-08 14:45
0

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

收获园豆:20
左眼水星 | 园豆:61 (初学一级) | 2019-05-09 17:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册