我有一个向其发送数据的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;
}但是,如果我把它放在一个运行在IIS-Express或IIS中的Asp.Net应用程序(目标是框架4.6.1)中,它每次都会超时。
这里我漏掉了什么?
发布于 2017-03-15 13:09:29
似乎当您在Asp.Net应用程序的非异步上下文中调用use async方法时,它会导致某种排序的死锁。
在我的例子中,我需要知道它是否已经超时,这样我就不能让它异步运行,并且在async调用完成之后以及它是否失败后,我需要完成一些工作。
我就是这么做的
Task.Run(() =>
{
if (!sender.SendAsync(eventData).Wait(TimeSpan.FromMilliseconds(10000)) )
{
int a = 0;
}
});这让我既可以处理超时,也可以处理成功。不幸的是,不能选择让整个调用堆栈成为async,所以使用await是不可能的。
TL;DR :在ASP.NET应用程序中调用.Wait()可能会导致死锁。
https://stackoverflow.com/questions/42786010
复制相似问题