在我的控制台应用程序中,Parallel Foreach循环面临一个奇怪的问题,我循环遍历一个实体集合,即轮询并调用一个api来获取url,并调用一个getTemplateDiscription函数来获取各种语言内容。问题是当我使用单线程运行它时,它可以正常工作,但是当我使用多线程运行时,没有为所有记录设置内容,即某些内容被设置为null。但是与单线程工作正常。以下是代码段:
//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;
}