You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure Event Hub时,控制台程序执行CreateBatchAsync后停止

问题分析与解决

你的代码卡在CreateBatchAsync方法,大概率是以下几种原因导致,逐个排查即可:

1. 同步上下文死锁(控制台程序最常见)

如果你的Main方法是同步类型(比如static void Main()),直接调用异步方法会触发死锁——await会捕获当前同步上下文,而控制台程序的同步上下文会等待异步操作完成,但异步操作又需要上下文释放,双方互相卡住。

解决办法:把Main改成异步方法:

static async Task Main(string[] args)
{
    int numOfEvents = 3;

    EventHubProducerClient producerClient = new EventHubProducerClient(
        "<EVENT_HUB_NAMESPACE>.servicebus.windows.net",
        "<HUB_NAME>",
        new DefaultAzureCredential());

    try
    {
        using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

        for (int i = 1; i <= numOfEvents; i++)
        {
            if (!eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes($"Event {i}"))))
            {
                throw new Exception($"Event {i} is too large for the batch and cannot be sent.");
            }
        }

        await producerClient.SendAsync(eventBatch);
        Console.WriteLine($"A batch of {numOfEvents} events has been published.");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"错误信息:{ex.Message}");
    }
    finally
    {
        await producerClient.DisposeAsync();
    }
}

2. 身份验证流程卡住

DefaultAzureCredential会尝试多种认证方式(本地Azure CLI、VS登录账户、环境变量等),如果没有找到有效认证源,可能会静默等待超时,而非立即抛出异常。

解决办法:

  • 先通过Azure CLI完成本地登录:运行az login命令并完成身份验证
  • 或者直接用Event Hub连接字符串替代DefaultAzureCredential(测试场景更简单):
// 替换为你的Event Hub连接字符串和Hub名称
var connectionString = "Endpoint=sb://<namespace>.servicebus.windows.net/;SharedAccessKeyName=<key-name>;SharedAccessKey=<key>";
EventHubProducerClient producerClient = new EventHubProducerClient(connectionString, "<HUB_NAME>");

3. 网络/防火墙限制

你的机器可能无法连接到Event Hub服务地址,导致请求挂起。

解决办法:

  • 检查防火墙是否允许出站连接到*.servicebus.windows.net的5671/5672(AMQP协议)和443端口
  • 若在企业网络下,需配置代理并在代码中指定:
var proxy = new WebProxy("http://你的代理地址:端口");
var clientOptions = new EventHubProducerClientOptions
{
    TransportType = EventHubsTransportType.AmqpWebSockets,
    Proxy = proxy
};

EventHubProducerClient producerClient = new EventHubProducerClient(
    "<EVENT_HUB_NAMESPACE>.servicebus.windows.net",
    "<HUB_NAME>",
    new DefaultAzureCredential(),
    clientOptions);

4. 依赖包版本问题

如果使用的Azure.Messaging.EventHubs版本过旧或存在兼容性bug,也可能引发异常行为。

解决办法:

  • 在NuGet包管理器中搜索Azure.Messaging.EventHubs,更新到最新稳定版本

另外,建议在代码中添加全局异常捕获,这样即使操作卡住后抛出异常,也能看到具体错误信息,方便快速定位问题。

内容的提问来源于stack exchange,提问作者Ellen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:13:14