В моем консольном приложении, сталкивающемся со странной проблемой с циклом Parallel Foreach, я перебираю одну коллекцию entity, т. Е. Опрос и вызываю один API для получения URL-адреса и одну функцию getTemplateDiscription для получения содержимого различного языка. Проблема заключается в том, что когда я запускаю его с одним потоком, он работает правильно, но когда я работаю с несколькими потоками, контент не устанавливается для всех записей, то есть некоторый контент становится нулевым. Но работает нормально с одной нитью. Ниже приведен фрагмент кода:
//Global variable - Outside the Parallel Foreach.
//Guid contactId, templateIdEnglish, templateIdEnglishReminder, templateIdGerman, templateIdGermanReminder
Parallel.ForEach<acn_poll, OrganizationServiceProxy>(
pollList,
new ParallelOptions() { MaxDegreeOfParallelism = maxDegreeOfParallelism },
() => { return CreateServiceProxy(); },
(poll, loopstate, index, threadProxy) =>
{
//Logic to call api
var content1 = getTemplateDescription(contactId, templateIdEnglish, threadProxy);
var content2 = getTemplateDescription(contactId, templateIdEnglishReminder, threadProxy);
var content3 = getTemplateDescription(contactId, templateIdGerman, threadProxy);
var content3 = getTemplateDescription(contactId, templateIdGermanReminder, threadProxy);
//update poll entity with Content
}
Я пытался отлаживать в режиме многопоточности (то есть maxDegreeOfParallelism> 1), но не получил никакой подсказки, поскольку код запускается в зигзагообразной форме из-за многопоточности. Ниже приведена функция, которая не возвращает результат, как ожидалось. В однопоточном режиме все содержимое поля правильно, но в режиме многопоточности как-то возвращает ноль.
public static string getTemplateDescription(Guid contactId, Guid templateId, IOrganizationService service)
{
if (templateId == Guid.Empty)
return "";
string content = string.Empty;
InstantiateTemplateRequest instTemplateReq = new InstantiateTemplateRequest
{
TemplateId = templateId,
ObjectId = contactId,
ObjectType = "Contact"
};
InstantiateTemplateResponse instTemplateResp = (InstantiateTemplateResponse)service.Execute(instTemplateReq);
if (instTemplateResp != null)
{
Entity template = instTemplateResp.EntityCollection.Entities[0];
if (template != null && template.Attributes.Contains("description"))
{
content = template.Attributes["description"].ToString();
}
}
return content;
}