2017-09-05 5 views
0

장치 알림 논리를 처리하는 Azure 웹 응용 프로그램의 컨트롤러 코드입니다. 내가하고있는 일은 ASP MVC 컨트롤러에서 아래 표시된 코드를 호출하는 것입니다. 하지만 실행하면 브라우저에서 계속 보류중인 요청을받습니다 (중단됩니다). 버튼을 클릭하면 컨트롤러에서 웨이크 업 메서드가 호출됩니다.MVC 웹 응용 프로그램에서 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 –