为什么这个 ParallelForEachAsync-Method 从不 return?
Why does this ParallelForEachAsync-Method never return?
我尝试使用此项目中的 ParallelForEachAsync 方法异步和并行执行此代码:https://github.com/Dasync/AsyncEnumerable。不幸的是,该方法从未 returns。
SampleProduct 是一个简单的 DTO,它有一个布尔值 属性 和两个字符串属性。
GetOsmData 方法尝试通过 http 请求获取数据,但经常抛出异常。
我的第一次尝试没有使用 .ConfigureAwait(false),但结果相同...
如果我使用产品列表尝试此方法 (products.Count = 8) result.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() 解决了问题。
不过还是感谢您的回复!
我尝试使用此项目中的 ParallelForEachAsync 方法异步和并行执行此代码:https://github.com/Dasync/AsyncEnumerable。不幸的是,该方法从未 returns。 SampleProduct 是一个简单的 DTO,它有一个布尔值 属性 和两个字符串属性。 GetOsmData 方法尝试通过 http 请求获取数据,但经常抛出异常。
我的第一次尝试没有使用 .ConfigureAwait(false),但结果相同... 如果我使用产品列表尝试此方法 (products.Count = 8) result.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() 解决了问题。
不过还是感谢您的回复!