我这里有一个非常奇怪的情况,似乎 forAll() plinq-query 移除了我的一些自定义对象,说实话,我不知道为什么会这样。
var myArticles = data.FilterCustomerArticles([]params]).ToList(); //always returns 201 articles
result.Articles = new List<ArticleMinimal>();
try
{
myArticles.AsParallel().ForAll(article =>
{
result.Articles.Add(new ArticleMinimal()
{
ArticleNumber = article.ArticleNumber,
Description = article.Description,
IsMaterial = false,
Price = article.PortionPrice.HasValue ? article.PortionPrice.Value : decimal.Zero,
Quantity = 1,
ValidFrom = new DateTime(1900, 1, 1),
ValidTo = new DateTime(2222, 1, 1)
});
});
}
catch (Exception ex)
{
...
}
上面的代码每次调用时返回不同数量的结果。它应该返回201个ArticleMinimal
对象,但实际上它会返回200、189、19x等。有时会返回201,但没有任何异常或错误信息。它只是返回少于应该返回的对象。
将代码更改为“老派”的foreach循环后,我总是得到了期望的201个对象。
有效代码:
var myArticles = data.FilterCustomerArticles([]params]).ToList(); //always returns 201 articles
result.Articles = new List<ArticleMinimal>();
try
{
foreach (var article in myArticles) {
result.Articles.Add(new ArticleMinimal()
{
ArticleNumber = article.ArticleNumber,
Description = article.Description,
IsMaterial = false,
Price = article.PortionPrice.HasValue ? article.PortionPrice.Value : decimal.Zero,
Quantity = 1,
ValidFrom = new DateTime(1900, 1, 1),
ValidTo = new DateTime(2222, 1, 1)
});
}
}
catch (Exception ex)
{
...
}
此外,在更多的代码行后,我又有了一个像这样的forAll
:
try
{
result.Articles.AsParallel().ForAll(article =>
{
if (article.Weight != null){
...
}
});
}
catch (Exception)
{
...
}
使用第一个
forAll
方法会抛出NullReferenceException
异常,我认为是因为它期望201个对象,但有些列表条目为空。现在我的实际问题是:为什么第一个forAll
方法返回的对象比应该返回的少?我想到的唯一线索就是内联声明new ArticleMinimal(){ ...});
- 但即使这是原因,对我来说也很奇怪。在使用PLINQ的同时是否不可能这样做呢?我只是猜测。希望你能帮助解答。最好的问候,Dom
result.Articles
集合),如果这个对象不是线程安全的,那么很可能会破坏该对象。 - Lasse V. Karlsen.AsParallel()
,然后保留其余部分,直到你认为这是一个性能问题。也许在ArticleMinimal
的构造函数中会发生一些耗时的事情,但也许名称“Minimal”是不正确的? - Lasse V. Karlsen