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

为何EventStore异步调用会导致.NET程序提前终止?

为何这些异步调用会终止程序执行?

问题的核心原因有两个:

  • async void的特性:Parse方法定义为async void,这种写法是专门为传统事件处理场景设计的,调用方无法等待它执行完成。当Main方法调用Parse()后,会直接继续执行后续代码(此处Main没有后续代码),随后进程就退出了,根本不等异步操作完成。
  • Main方法未等待异步操作:控制台程序的Main方法默认是同步的,调用异步方法后不会主动等待其完成,只要Main执行完毕,整个程序就会终止。

解决办法

  1. 把async void的方法改成返回Task的异步方法,让调用方可以等待它完成
  2. 将Main方法改为异步(C# 7.1及以上版本支持),通过await等待异步操作结束

修改后的完整代码:

static async Task Main(string[] args)
{
    var connectionstring = "esdb+discover://127.0.0.1:2113?tls=false";
    var settings = EventStoreClientSettings.Create(connectionstring);
    conn = new EventStoreClient(settings);
    await Parse(); 
}

static async Task Parse()
{
    var count = await GetEventCount("test@@test");
    // 现在可以正常执行到这里了
}

public static async Task<int> GetEventCount(string streamname)
{
    var l = conn.ReadStreamAsync(Direction.Backwards, streamname, StreamPosition.Start);

    var count = 0; 
    await foreach (var item in l)
    {
        count++; 
    }

    return count;
}

如果你的项目使用的是不支持异步Main的旧版C#,可以在同步Main里通过.Wait()来等待异步方法完成(控制台环境下不会有死锁风险):

static void Main(string[] args)
{
    var connectionstring = "esdb+discover://127.0.0.1:2113?tls=false";
    var settings = EventStoreClientSettings.Create(connectionstring);
    conn = new EventStoreClient(settings);
    Parse().Wait(); 
}

static async Task Parse()
{
    var count = await GetEventCount("test@@test");
    // 同样可以执行到这里
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:35:15