[英]Use Parallel.Foreach to update properties of entity with thread safety
我正在嘗試利用 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 替換上面的代碼。
我同意這些評論,那里有一些代碼味道,並且可能以更有效的方式編寫查詢比通過並行獲得的任何優化更能加快整個過程。
話雖如此,我認為您正在尋找這樣的東西:
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
中的操作是只讀的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.