我试图利用Parallel.Foreach更新实体的属性:如代码示例所示,联系
var contactIds = new List<int>();
contactIds.AddRange(res.RelatedContacts.Select(c => c.IdVal).ToList());
contacts = await _dbContext.Contacts.Where(co => contactIds.Contains(co.ContactId)).ProjectTo<ContactDTO>(_mapper.ConfigurationProvider).AsNoTracking().ToListAsync();
foreach (var contactrec in contacts)
{
var contact = contacts.FirstOrDefault(c => c.ContactId.Equals(contactrec.ContactId));
if (contact != null)
{
contact.address = addresses.FirstOrDefault(a => a.AddressId.Equals(contact.AddressId));
contact.ImagePath = contact.ImageId > 0 ? images.FirstOrDefault(im => im.ImageId.Equals(contact.ImageId)).FilePath : "NA";
}
}
我想用线程安全将上述代码替换为Parallel.Foreach。
答案 0 :(得分:1)
我同意这些评论,那里有一些代码味道,并且以更有效的方式编写查询可能比通过并行性获得的任何优化都更快地加快了整个过程。
话虽如此,我认为您正在寻找这样的东西:
var contactIds = new List<int>();
contactIds.AddRange(res.RelatedContacts.Select(c => c.IdVal).ToList());
contacts = await _dbContext.Contacts.Where(co => contactIds.Contains(co.ContactId)).ProjectTo<ContactDTO>(_mapper.ConfigurationProvider).AsNoTracking().ToListAsync();
Parallel.Foreach(contacts, contact => Update(contact));
//or: Parallel.Foreach(contacts, Update);
void Update(Contact contact){
contact.address = addresses.FirstOrDefault(a => a.AddressId.Equals(contact.AddressId));
contact.ImagePath = contact.ImageId > 0 ? images.FirstOrDefault(im => im.ImageId.Equals(contact.ImageId)).FilePath : "NA";
}
一些注意事项:
Update
中的操作是只读的。