我有一个我发送数据的Azure EventHub
。如果我在控制台应用程序(框架4.6.1)中使用以下代码,它将完美运行。
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-Express
或IIS
中运行,则每次都会超时。
我在这里缺少什么?
答案 0 :(得分: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()
可能会导致死锁。