首页 > 解决方案 > 为什么这个 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;
        }

标签: c#parallel-processingparallel.foreachiasyncenumerable

解决方案


在我同事的帮助下,我可以解决问题......问题不在于方法本身,而在于它的调用方式。我从 Main/UI-Thread 同步调用它。这似乎造成了僵局。使调用方法异步并等待 CheckOsmDataAsync() 解决了这个问题。

不过感谢您的回复!


推荐阅读