C # Parallel.ForEach, не работает должным образом - PullRequest
0 голосов
/ 26 мая 2019

В моем консольном приложении, сталкивающемся со странной проблемой с циклом 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...