MS Cognitive Face API调用DetectAsync无返回无异常问题求助
问题分析与解决方案
我仔细看了你的代码,程序执行到await faceServiceClient.DetectAsync(memStream, true, true);时无异常直接终止,主要是几个关键问题导致的,咱们一步步拆解解决:
1. 同步Main方法未等待异步操作完成
你的Main方法是同步的,调用Start()这个异步方法时没有等待它执行完成。程序启动后,Main执行完Start();就会继续往下走,而异步操作还在后台运行,这时候程序会直接退出,看起来就像是DetectAsync没返回就终止了。
解决办法:把Main改成异步方法(C# 7.1及以上版本支持),或者用.Wait()阻塞等待异步操作完成(更推荐异步Main的写法)。
2. MemoryStream的读取位置未重置
你把fileStream的内容读入memStream后,memStream的位置指针停留在流的末尾,DetectAsync从当前位置开始读取,自然读不到任何内容,可能导致请求无响应或静默失败。必须在调用DetectAsync前把Position设为0。
3. 异常处理过于简略,无法排查问题
你的catch块只输出"Error"这类模糊提示,完全看不到具体的异常信息(比如API调用失败原因、网络问题、流操作错误等),这对排查问题非常不利。应该把异常的Message和StackTrace完整打印出来。
修改后的关键代码示例
这里给你调整后的核心代码,你可以参考替换:
// 首先将Main改为异步方法(C# 7.1+支持) static async Task Main(string[] args) { Console.Title = "Face Detect"; await Start(); // 等待异步操作执行完成 } // 调整SaveFiles方法,修复流操作和异常处理 static async Task SaveFiles(string imageFolderPath) { try { DirectoryInfo dInfo = new DirectoryInfo(imageFolderPath); string[] extensions = new[] { ".jpg", ".jpeg" }; FileInfo[] files = dInfo.GetFiles() .Where(f => extensions.Contains(f.Extension.ToLower())) .ToArray(); if (files.Length == 0) await ReStart("No files found in the specified folder! "); else { string subscriptionKey = "ADSFASDFASDFASDFASDFASDFASDF"; if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["subscriptionKey"])) subscriptionKey = ConfigurationManager.AppSettings["subscriptionKey"].ToString(); // 如果你的Face API资源不在默认区域,需要指定Endpoint IFaceServiceClient faceServiceClient = new FaceServiceClient(subscriptionKey); // 示例:如果资源在东亚区域,改为: // IFaceServiceClient faceServiceClient = new FaceServiceClient(subscriptionKey, "https://eastasia.api.cognitive.microsoft.com/"); foreach (FileInfo file in files) { try { // 用Path.Combine拼接路径更安全,避免手动拼接的斜杠问题 using (FileStream fileStream = File.OpenRead(Path.Combine(imageFolderPath, file.Name))) using (MemoryStream memStream = new MemoryStream()) { // 用CopyToAsync替代手动读缓冲区,更可靠 await fileStream.CopyToAsync(memStream); memStream.Position = 0; // 重置流的读取位置到开头 try { var faces = await faceServiceClient.DetectAsync(memStream, true, true); if (faces != null && faces.Length > 0) { Console.WriteLine($"找到 {faces.Length} 张人脸在图片: {file.Name}"); foreach (var face in faces) { var rect = face.FaceRectangle; Console.WriteLine($"人脸位置: 左={rect.Left}, 上={rect.Top}, 宽={rect.Width}, 高={rect.Height}"); } } else Console.WriteLine("图片中未检测到人脸: " + file.FullName); } catch (Exception ex) { Console.WriteLine($"检测人脸出错 ({file.Name}): {ex.Message}"); Console.WriteLine("错误堆栈信息: " + ex.StackTrace); } } } catch (Exception ex) { Console.WriteLine($"读取文件出错 ({file.Name}): {ex.Message}"); } } } } catch (Exception ex) { Console.WriteLine($"意外错误: {ex.Message}"); Console.WriteLine("错误堆栈信息: " + ex.StackTrace); } await ReStart(); }
额外注意事项
- 确保你的
subscriptionKey是有效的,并且对应的Azure Face API资源已经创建,区域要和客户端配置一致(默认是westus,如果资源在其他区域,必须在构造FaceServiceClient时指定正确的Endpoint)。 - 检查网络连接,确保程序能正常访问Face API的端点。
- 如果使用的是旧版本的
Microsoft.ProjectOxford.Face包,建议升级到最新版本(现在官方包名是Microsoft.Azure.CognitiveServices.Vision.Face,旧版本也能运行,但新版本修复了更多bug)。
内容的提问来源于stack exchange,提问作者user1640256
相关产品推荐
相关产品推荐

