2016-10-18 10 views
0

ビデオで認識を使用してMicrosft Emotions Apiを使用しようとしているので、クライアントライブラリをダウンロードして使用しようとしましたが、デバッグ時に例外なくステップアウトしますスレッドprbolemかもしれません - それはメソッドで起こります: "recognInVideoAsync"。Microsoft Emotions API、RecognizeInVideoAsync c#

私のコード:

public static async void testEmotionApi() 
{ 
    var emotionServiceClient = new EmotionServiceClient("c580db97556e405980212f3ff31ac762"); 

    VideoEmotionRecognitionOperation videoOperation; 
    using (var fs = new FileStream(@"D:\Downloads\testForApp.mp4", FileMode.Open)) 
    { 
     videoOperation = await emotionServiceClient.RecognizeInVideoAsync(fs); 
    } 

    VideoOperationResult operationResult; 
    while (true) 
    { 
     operationResult = await emotionServiceClient.GetOperationResultAsync(videoOperation); 
     if (operationResult.Status == VideoOperationStatus.Succeeded || operationResult.Status == VideoOperationStatus.Failed) 
     { 
      break; 
     } 

     Task.Delay(30000).Wait(); 
    } 

    var emotionRecognitionJsonString = operationResult.ToString(); 
} 
+0

'Task.Delay(30000).WAIT()の目的は何ですか; '?あなたはすでに非同期呼び出しを待っています... – Milen

+0

ここで提供されている例を守らない理由:https://www.microsoft.com/cognitive-services/en-us/Emotion-api/documentation/GetStarted – Milen

+0

また、サンプルコードにAPIキーを含めるのは良い方法ではありません。 – Milen

答えて

1

これは、非同期プログラミングはC#でどのように動作するかです。ソース形式では1つのメソッドがあるようですが、実際にはメソッドは複数の部分に分割されており、境界はawaitです。つまり、あなたが書いたように、RecognizeInVideoAsyncが呼び出された後に、testEmotionApiメソッドが返されます。残りのメソッドは、非同期呼び出しが完了したときに実行されますが、その結果を待つ方法はありません。あなたが代わりに行うことができますすることです:

public static async Task<VideoOperationResult> testEmotionApi() 
{ 
    // everything here the same, except... 
    return operationResult; 
} 

public async Task callEmotionTestApi() 
{ 
    VideoOperationResult result = await testEmotionApi(); 
    ... 
} 

か、あなたは、呼び出し元が非同期にしたくない場合は、

public void callEmotionTestApi() 
{ 
    VideoOperationResult result = testEmotionApi().GetAwaiter().GetResult(); 
    ... 
}