【发布时间】:2020-11-13 14:44:12
【问题描述】:
假设我有一个异步构建器方法,并且我需要将一组 db 模型转换为一组 UI 模型,我编写了下面的代码(例如简化)。
阅读this medium article 后,代码被重构为一直冒泡 ASYNC,但我仍然想知道
- 将
collection.GetConsumingEnumerable()阻塞,导致死锁,类似于.Wait或.Result - 在异步方法中流式传输项目的首选方式是什么
public IEnumerable<GenericDevice> GetGenericDevices(SearchRequestModel srModel)
{
var collection = new BlockingCollection<GenericDevice>(new ConcurrentBag<GenericDevice>());
Task.Run(() => QueueGenericDevices(collection, srModel));
foreach (var genericDevice in collection.GetConsumingEnumerable())
{
yield return genericDevice;
}
}
private async Task QueueGenericDevices(BlockingCollection<GenericDevice> collection, SearchRequestModel srModel)
{
var efDevices = _dbDeviceRepo.GetEfDevices(srModel);
var tasks = efDevices
.Select(async efDevice =>
{
var genericDevice = await BuildGenericDevice(efDevice, srModel);
collection.Add(genericDevice);
});
await Task.WhenAll(tasks);
collection.CompleteAdding();
}
【问题讨论】:
-
如果您的目标是 .NET Core 3+,那么可以使用异步枚举器。
标签: c# async-await ienumerable