C#Parallel.ForEach,未按预期运行

时间:2019-05-26 14:28:25

标签: c# parallel.foreach

在我的控制台应用程序中,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;
}

0 个答案:

没有答案