EventStore 异步调用终止程序

问题描述 投票:0回答:2

为什么这些异步调用会终止执行?

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(); 
}

static async void Parse()
{
    var count = await GetEventCount("test@@test");
    // can not reach here ... program ends exit code 0...
}

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;
}
c# asynchronous async-await eventstoredb
2个回答
2
投票

根本问题是您没有等待

Parse
完成,因此
Main
方法在完成之前就存在,从而终止程序。事实上,代码中的任何其他内容都不会导致终止。

第一个可能的解决方案是强制等待呼叫:

Parse().Wait();

直接使用

Wait
通常不是一个好的选择,并且是更复杂程序中死锁的常见原因,尽管在这里使用可能没问题。

更好的解决方案是使

Main
也异步,并像其他地方一样使用常规
async
/
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();
}

这两个选项都会导致对

Parse()
的调用等待完成,从而有机会使用其输出。


1
投票

您应该

await
您的
async
方法。另请参阅https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming

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 ParseAsync(); 

}
static async Task ParseAsync()
        {
            var count = await GetEventCount("test@@test");
// can not reach here ... program ends exit code 0...

}
    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;
        }
© www.soinside.com 2019 - 2024. All rights reserved.