C# 同步多线程的问题求解一下~

UWPCoder 2019-05-06 12:14:09
(基于百度人脸识别考勤 WPF版)
遇到了同步多线程问题
之前一直对这一块很生疏

如图所示:
info需要获取到之后才能往下走
同理id获取到之后才能往下走
应该只能用同步,不然异步等待的这一回时间,又要执行一次签到了

这样可以完成需求,但是UI会卡死......咋解决鸭 各位大佬
...全文
191 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OrdinaryCoder 2019-05-06
  • 打赏
  • 举报
回复
async await了解一下
love氟利昂 2019-05-06
  • 打赏
  • 举报
回复
当然要做异步的呀。
我们这边平常涉及Winform和WPF的设计是基于事件的。
如果是我的话时这么设计的,CheckFace()中当识别到人时的时候触发识别到人的事件,获取的图像该在哪里显示还照常显示。处理识别到人的事件中的处理数据时可以取消订阅该事件,防止多次触发;当然也可以做优化,在识别到人脸后判断一个标志位,获取图像后时候直接不执行识别人脸的功能,获取的图像该在哪里显示还照常显示。看你需求喽!
当然最简单的设置一个标志位,处理的时候检测标志位判断执不执行。
jx315425246 2019-05-06
  • 打赏
  • 举报
回复
//在主线程中
FaceInfo fi = new FaceInfo();
fi.GetFaceId+=new FaceInfo.GetFaceIdHandler(fi_GetFaceId);
fi.GetFaceInfo+=new FaceInfo.GetFaceInfoHandler(fi_GetFaceInfo);
fi.start(); //加上这句

//处理两个事件
fi_GetFaceId
fi_GetFaceInfo
jx315425246 2019-05-06
  • 打赏
  • 举报
回复
引用 6 楼 exception92 的回复:
这样可以完成需求,但是UI会卡死......
-》异步非阻塞,楼上已经回答了。注意跨线程调用问题,查询WPF中的Dispatcher。

不会的,不信你试一下,新起一个线程完成人脸识别

public void start()
{
Thread pro=new Thread(new ThreadStart(start_pro);
pro.Start();
}

返回的是结果
exception92 2019-05-06
  • 打赏
  • 举报
回复
这样可以完成需求,但是UI会卡死...... -》异步非阻塞,楼上已经回答了。注意跨线程调用问题,查询WPF中的Dispatcher。
jx315425246 2019-05-06
  • 打赏
  • 举报
回复
把CheckFace作成一个事件

class FaceInfo
{
public delegate void GetFaceInfoHandler(object info);
public event GetFaceInfoHandler GetFaceInfo;

public delegate void GetFaceIdHandler(object id);
public event GetFaceIdHandler GetFaceId;

public void start()
{
Thread pro=new Thread(new ThreadStart(start_pro);
pro.Start();
}

private void start_pro()
{
while (true)
{
checkface();
Thread.Sleep(100);
}
}

private void checkface()
{
base64IMG = aceADD.GetCameraIMG();
object info = (object)GetBaiduFaceInfo();
GetFaceInfo(info);
if(Convert.ToInt32(info["error_code"]==0)
{
object id=GetBaiduId();
if(id!=null)
GetFaceId(id);
}
}
}


//在主线程中
FaceInfo fi = new FaceInfo();
fi.GetFaceId+=new FaceInfo.GetFaceIdHandler(fi_GetFaceId);
fi.GetFaceInfo+=new FaceInfo.GetFaceInfoHandler(fi_GetFaceInfo);

//处理两个事件
fi_GetFaceId
fi_GetFaceInfo

wanghui0380 2019-05-06
  • 打赏
  • 举报
回复
为啥不能是异步等待呢? 当然设计上是看你自己的策略,比如从你的描述,我们认为,你想的策略是前面一个图片没识别完,后面一个直接丢弃,这个直接用互斥就好 如果你说前面一个每做完,后面一个不准进--------不是丢弃,只是现在不准进,那么就lock就好,当然lock是你现在的同步代码。如果是异步代码用semaphoreSlim 异步信号量控制就成 当然就我个人来说,根本就不担心啥。只要百度不限制我(假设百度不对我ip进行并发限制),我就直接new 一个 图像识别对象,让他自己做自己的。没啥什么重复签到的问题,因为他是图像识别,我又不知道这图是不是一个人的,我要知道这是同一个人,我还用百度干嘛(当然,不停new这个也是问题,那么就池化一下就好) 其实这里就顺带多出一个问题,“怎么抽取关键帧”,所以我的说法是哟专业的“人脸识别摄像头”比如face++的,他自己抽取一定时间的关键帧,他自己先边缘计算得并把人脸区域给你扣出来,他自己推送给你这段时间内效果最好的目标图像(实际上是效果最好的N个目标的最优图像),他自己也可以干脆把你那个百度给替换掉,他甚至能自己边缘计算,把目标的特征id直接给你
秋的红果实 2019-05-06
  • 打赏
  • 举报
回复
你查下,获取info,id的方法有没有异步的,...Invoke(),有没有异步的方法可以取代,有的话

public async void CheckFace()
{
    var info=await new ....异步方法(); 


110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧