2017-03-14 34 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()可能导致死锁。