为什么这些异步调用会终止执行?
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;
}
根本问题是您没有等待
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()
的调用等待完成,从而有机会使用其输出。
您应该
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;
}