2017-09-05 7 views
0

これはデバイス通知ロジックを処理するAzure Web Appのコントローラコードです。私がやっているのは、ASP MVC Controllerから以下のコードを呼び出すことです。しかし、私はそれを実行すると、私は(それがハングする)ブラウザからの保留中の要求を取得します。 ボタンをクリックすると、コントローラのWakeupメソッドが呼び出されます。MVC WebアプリケーションからAzure IoTハブデバイスに送信するときにアプリケーションがハングアップする

コンソールアプリケーションのコードは、MSDNのコードと異ならない。私は何が欠けていますか?

using System.Text; 
using Microsoft.Azure.Devices; 

public class MyTemplate2Controller : Controller 
    { 
     static ServiceClient serviceClient; 
     static string connectionString = "HostName=azure-devices.net;SharedAccessKeyName=iothub;SharedAccessKey=mrUPt*2318C18K3LUk+oFarkNQ4vRvHrOa/eg="; 

     private AsyncController Task SendCloudToDeviceMessageAsync() 
     { 
      var asd = "{13A20041677B0,4,15,0}"; 
      var commandMessage = new Message(Encoding.ASCII.GetBytes(asd)); 
      return await serviceClient.SendAsync("Test_Comp_Dev_1", commandMessage).ConfigureAwait(continueOnCapturedContext: false); 
     } 
     public void Wakeup() 
     { 

      serviceClient = ServiceClient.CreateFromConnectionString(connectionString); 

      SendCloudToDeviceMessageAsync().Wait(); 
     } 
+0

この質問はあまりにも一般的ですが、私はあなたがしようとすると、コードが失敗している場所を正確に確認するために、リモートデバッグセッションを行うお勧めします。 https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging-azure –

答えて

1

は、次のことを試してください。

public void Wakeup() 
    { 
     serviceClient = ServiceClient.CreateFromConnectionString(connectionString); 

     System.Threading.ThreadPool.QueueUserWorkItem(a => SendCloudToDeviceMessageAsync().Wait()); 
    } 
+0

その作業。問題の内容を説明できますか? – TheChosenOne94

+0

問題はsyncメソッドの内部でデッドロックが待っていました。メソッドを生成するには、ThreadPool.QueueUserWorkItemを使用するのが簡単な回避策でした。より良い解決策は、非同期コントローラを使用することです。詳細は次を参照してください。https://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx、https://stackoverflow.com/質問/ 20227401/using-await-taskt-async-hangs-controller-in-mvc-app –

関連する問題