c# - 为什么这个 ParallelForEachAsync-Method 永远不会返回?
问题描述
我尝试使用此项目中的 ParallelForEachAsync 方法异步和并行执行此代码:https ://github.com/Dasync/AsyncEnumerable 。不幸的是,该方法永远不会返回。SampleProduct 是一个简单的 DTO,它具有一个布尔属性和两个字符串属性。GetOsmData 方法尝试通过 http-request 获取数据,但经常抛出异常。
我的第一次尝试是没有 .ConfigureAwait(false),但结果相同...如果我尝试使用产品列表 (products.Count = 8) 使用此方法,结果.Count 总是停止 7。
private async Task<ConcurrentBag<SampleProduct>> CheckOsmDataAsync(List<SampleProduct> products)
{
var result = new ConcurrentBag<SampleProduct>();
await products.ParallelForEachAsync(
async product =>
{
OsmData osmData;
try
{
osmData = await GetOsmData(_osmUrl.Replace("articlenumber", product.MaterialNumber.ToString())).ConfigureAwait(false);
}
catch (Exception e)
{
osmData = null;
}
if (osmData != null && osmData.PrintingData.Count > 0)
{
product.OsmPrintImageAvailable = true;
}
else
{
product.OsmPrintImageAvailable = false;
}
result.Add(product);
},
// 0 => Chooses a default value based on the processor count
maxDegreeOfParallelism: 0
);
return result;
}
解决方案
在我同事的帮助下,我可以解决问题......问题不在于方法本身,而在于它的调用方式。我从 Main/UI-Thread 同步调用它。这似乎造成了僵局。使调用方法异步并等待 CheckOsmDataAsync() 解决了这个问题。
不过感谢您的回复!
推荐阅读
- google-api - 使用 schedule_time/scheduledTime 创建 CourseWork 会返回内部错误
- javascript - SVG 过滤器:宽度 100% 高度 100% 不覆盖图像
- html - 带有 chrome 扩展名的网站上的空地址栏
- java - JavaFX 将列表大小绑定到 this.setTitle()
- java - 将偏移量和eof文件查找到另一个文件中
- reactjs - React Native 如何通过更改语言来更改整个应用程序文本?
- javascript - 如何提醒没有 id 的单击 div 的内部 html?
- alfresco - 如何在数据库中查询alfresco的元数据与内容的关系
- html - 在此上下文中不允许使用自动填充字段名称“邮政编码”
- ruby-on-rails - 从 4.2 升级后与 Rails 5.0.6 捆绑时出现捆绑器错误