2013-10-09 5 views
0

Я разработал страницу ASP.NET, которая извлекала данные из CRM 2011. Существует несколько приглашений, и на страницу требуется несколько секунд для загрузки.Разница между WaitAll и Wait

Я думал, что могу использовать некоторый параллелизм, чтобы ускорить процесс.

Это код:

Task[] tasks = new Task[4]; 

tasks[0] = Task.Run(() => 
{ 

    RetrieveAttributeRequest retrieveFreightTerm = new RetrieveAttributeRequest { }; 
    retrieveFreightTerm.EntityLogicalName = "account"; 
    retrieveFreightTerm.LogicalName = "address1_freighttermscode"; 

    retrieveFreightTerm.MetadataId = Guid.Empty; 
    retrieveFreightTerm.RetrieveAsIfPublished = true; 

    RetrieveAttributeResponse retrieveFrieghtTermResponse = (RetrieveAttributeResponse)Service.Execute(retrieveFreightTerm); 

    PicklistAttributeMetadata retrievedPicklistAttributeMetadata = (PicklistAttributeMetadata)retrieveFrieghtTermResponse.AttributeMetadata; 


    OptionMetadata[] optionlist = retrievedPicklistAttributeMetadata.OptionSet.Options.ToArray(); 

    if (!IsPostBack) 
    foreach (OptionMetadata oMD in optionlist) 
    { 
     FreightTermDropDownList.Items.Add(new ListItem(oMD.Label.UserLocalizedLabel.Label, oMD.Value.ToString())); 

    } 
}); 

после задач я использую

Task.WaitAll(); 

Я отладку коды и извлечение данных, но выпадающие списки пусты в любом случае.

Изменение

Task.WaitAll(); 

в

tasks[0].Wait(2000); 
tasks[1].Wait(2000); 
tasks[2].Wait(2000); 
tasks[3].Wait(2000); 

делает код для работы (у меня есть 4 задачи). В чем разница между двумя вариантами?

+0

Возможно, связано с вашей проблемой, что классы прокси-сервера службы CRM не являются потокобезопасными. Вам нужно убедиться, что каждая задача (или, по крайней мере, каждый поток) имеет свой собственный экземпляр службы организации и/или метаданных, а не все из них используют «Сервис». – shambulator

ответ

2

Вы должны передать tasks массив в WaitAll() метод:

Task.WaitAll(tasks); 

Разница между WaitAll() и Wait() является то, что Wait() используется, чтобы ждать завершения выполнения конкретной задачи (экземпляра, на котором Wait() называется) и WaitAll() ожидает завершения всех задач, заданных как параметр.

Снова, для того, чтобы работать, вам необходимо передать текущие задачи, которые вы ожидаете.

+1

@Stijn, 'WaitAll()' определяется как 'Task.WaitAll (params Task [] tasks)', поэтому его можно вызывать без параметра. – RePierre

+0

Хорошо пятнистый. Я удивлен, что это не бросает, если вы не выполняете никаких задач. – shambulator

Смежные вопросы