从 Asp.Net 个站点向 EventHub 发送数据
Sending data to EventHub from Asp.Net site
我有一个我向其发送数据的 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)中 运行 in IIS-Express
或 IIS
,它每次都会超时.
我在这里错过了什么?
似乎当您在 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()
可能会导致死锁。
我有一个我向其发送数据的 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)中 运行 in IIS-Express
或 IIS
,它每次都会超时.
我在这里错过了什么?
似乎当您在 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()
可能会导致死锁。