我正在实现面部识别功能。我可以上传人和图像,但是当我尝试发送图像进行比较时,DetectAsync方法失败,没有错误消息。我不确定问题是否出在方法上(我已在其他项目中成功实现)还是通过javascript或其他方式发送网络摄像头/图像。
我正在使用javascript检测网络摄像头中的脸并拍照。图片被发送到转换为流,然后发送到DetectAsync(stream)。它位于try-catch块中,但我没有收到异常,它只是返回到UI似乎已冻结的UI,因此无法重新加载该页面或导航至另一个页面。在“ Quickwatch”窗口中,我键入faceServiceClient.DetectAsync(stream),然后强制执行,我得到以下信息:
其他一些,但这些似乎最不相关
我希望获得一个FaceIDs(GUIDS)数组。图像中每张脸一张。或错误消息。获得GUIDS之后,我可以尝试在personGroup中找到与面孔的匹配。如果找到匹配项,则将用户名返回我的UI。我已经将此工作在MVC应用中。这是一个ASP.NET应用。
代码:
public async Task<string> DoFacialRecognition(string image)
{
string response = "";
FaceServiceClient faceServiceClient = new FaceServiceClient(subscriptionKey);
try
{
var imageToSend = ConvertBase64ToImage(image.Substring(22));
Stream stream = ConvertToStream(imageToSend, ImageFormat.Png);
var faces = await faceServiceClient.DetectAsync(stream, true, false);
var faceIds = faces.Select(face => face.FaceId).ToArray();
}
....
}
答案 0 :(得分:0)
问题出在一个或多个线程上。我不确定技术性或术语性,但我将尽我所能解释。这是一个aspx页面,它对异步方法进行ajax调用。这是我所期望的行为:
aspx-> ajax->异步方法A->异步方法B->回到A->回到ajax-> ajax处理响应。
实际发生的事情:
aspx-> ajax->异步方法A->异步方法B-> 返回到ajax或aspx 。
但是ajax正在等待方法A的响应,因此它忽略了方法B的响应(可能甚至不是正确的格式)。该页面仍处于“活动”状态,但是当用户尝试执行任何操作时,服务器没有响应,因为方法A仍在等待B的响应并锁定了代码。
如果您对线程和异步调用了解更多,请随时纠正我的理解!
解决: 我需要解决的信息由Stephen Cleary在这篇文章中提供:How to call asynchronous method from synchronous method in C#?。
您需要从ajax调用中“隐藏”异步方法。为此,Stephen有一个名为Nito.AsyncEx的nuget程序包。
序列如下:
aspx-> ajax->方法A->异步方法B->返回A->返回ajax-> ajax处理响应。
请注意,方法A不再是异步的。
代码如下:
using Nito.AsyncEx;
[WebMethod]
public static string CheckImage(string image)
{
var result = AsyncContext.Run(() => MyAsyncMethod(image));
return result;
}
private static async Task<string> MyAsyncMethod(string image)
{
//do async stuff
}