2017-03-14 85 views
2

我有一個Azure EventHub我發送數據。如果我在控制檯應用程序(框架4.6.1)中使用以下代碼,它將完美運行。從Asp.Net站點發送數據到EventHub

 eventHubClient = EventHubClient.CreateFromConnectionString(myConnString); 

     Console.WriteLine("Client Created"); 

     var sender = eventHubClient.CreatePartitionSender("1"); 

     var message = $"Message"; 

     Console.WriteLine($"Sending message: {message}"); 
     var eventData = new EventData(Encoding.UTF8.GetBytes(message)); 

     if (!sender.SendAsync(eventData).Wait(TimeSpan.FromMilliseconds(10000))) 
     { 
      int a = 0; 
     } 

但是,如果我把它放在一個Asp.Net應用程序(目標框架4.6.1)無論是在IIS-ExpressIIS運行,超時每一次。

我在這裏錯過了什麼?

+0

你爲什麼強迫所有物品進入第1部分?我正在使用這種方法,但是在使用await的異步方法中 - 等待10秒看起來很可疑 - 我會刪除它。 –

+0

@SimonW我不是強迫進入一個分區,這是示例代碼。我有5個分區,我發送事件。至於等待,這不是「等待10秒鐘」,它爲呼叫提供超時。 –

+0

如果刪除10秒超時,它會成功嗎?這是調用一個控制器或類似的調用?如果是這樣的話,Controller Action設置爲以異步方式運行? –

回答

1

似乎在Asp.Net應用程序的非異步上下文中調用async方法時,它會導致一些排序的死鎖。

以我爲例,我需要知道,如果它已經超時,所以我不能就這麼走了異步運行,並有後,如果它失敗async呼叫完成,以及我需要做的工作。

這是我做過什麼

Task.Run(() => 
{ 
    if (!sender.SendAsync(eventData).Wait(TimeSpan.FromMilliseconds(10000))) 
     { 
      int a = 0; 
     } 
}); 

這讓我處理這兩種超時以及成功。不幸的是,它不是一個選項,使整個調用堆棧async因此使用await是不可能的。

TL; DR:在ASP.NET應用程序中調用.Wait()可能導致死鎖。