【发布时间】:2021-12-19 03:43:13
【问题描述】:
为什么UseEventsFail 会抛出下面的代码?难道是我在不等待最后一个MoveNextAsync() 任务的情况下处理了异步枚举器?这个例子是我真实程序的简化重现,所以我需要处理异步枚举器来释放它的资源。而Task.CompletedTask 通常是一个Task.Delay(),用作UseEvents() 的超时。如果枚举器任务在超时任务之前完成,则不抛出异常。
异常的堆栈跟踪:
at Program.<<<Main>$>g__GenerateEvents|0_3>d.System.IAsyncDisposable.DisposeAsync()
代码:
// All these are ok
await GenerateEvents().GetAsyncEnumerator().DisposeAsync();
await using var enu = GenerateEvents().GetAsyncEnumerator();
await UseEvents();
await UseEvents2();
// This fail
await UseEventsFail();
async Task UseEvents()
{
await using var enu = GenerateEvents().GetAsyncEnumerator();
await Task.WhenAny(enu.MoveNextAsync().AsTask());
}
async Task UseEvents2()
{
var enu = GenerateEvents().GetAsyncEnumerator();
await Task.WhenAny(enu.MoveNextAsync().AsTask(), Task.CompletedTask);
}
async Task UseEventsFail()
{
await using var enu = GenerateEvents().GetAsyncEnumerator();
await Task.WhenAny(enu.MoveNextAsync().AsTask(), Task.CompletedTask);
}
async IAsyncEnumerable<bool> GenerateEvents()
{
while (true) {
await Task.Delay(1000);
yield return true;
}
}
【问题讨论】:
标签: c# .net .net-core async-await iasyncenumerable