2016-12-07 7 views
-1

Привет ребята я пытаюсь получить некоторые результаты Task.Run, но я не могу понять, насколькоПолучение результата от Task.Run

У меня есть несколько методов, которые я хотел бы работать параллельно и экстракт результате: Это один из методов

protected override async Task<IList<EducationDTO>> GetEmployeesEducation(int userId) 
{ 
    IList<EducationDTO> userEducation = await EducationService.GetEducationsByUserId(userId);   
    return userEducation.Count > 0 ? userEducation : null; 
} 

Вот где все методы будут работать параллельно

public async Task<DTOs.EmployeeDTO> GetEmployeeInfo(int userId) 
{ 
    EmployeeDTO employee = new EmployeeDTO(); 

    Task task = Task.Run(() => { 
     Parallel.Invoke(
     async() => { await GetEmployeeLanguages(userId); }, 
     // ... 
    }); 
    task.Wait(); 

    /// extract result and process how ??? 

    return employee; 
} 

Спасибо

+2

Почему бы не просто вызвать 'результат вар = ждать EducationService.GetEducationsByUserId (идентификатор пользователя),'? –

+0

@ bash.d Его метод GetEmployeesEducation не является асинхронным. Хотя это, вероятно, должно быть. – ThePerplexedOne

+0

@ ThePerplexedOne Спасибо, не видел этого. Но я думаю, что это было бы разумно. –

ответ

-2

Так это мое нахождение

public async Task<DTOs.EmployeeDTO> GetEmployeeInfo(int userId) 
{ 

    EmployeeDTO employee = new EmployeeDTO(); 

    Task<EmployeeDTO> task = Task.Factory.StartNew(() => 
    { 
     Parallel.Invoke(
     () => { employee.Languages = GetEmployeeLanguages(userId).Result; }, 
     () => { employee.Educations = GetEmployeesEducation(userId).Result; }, 
     () => { employee.OutExperiences = GetEmployeesOutExperience(userId).Result; }, 
     () => { employee.UbiExperiences = GetEmployeesUbiExperience(userId).Result; }); 

     return employee; 
    }); 
    task.Wait(); 

    return task.Result; 

} 

Если у вас есть какие-либо другие предложения, или лучший подход, пожалуйста, поделитесь. Спасибо.

+2

lookup 'Task.WhenAll' и использовать его вместо параллельного вызова –

+3

Зачем использовать Parallel.Invoke, когда у вас уже есть все ваши задачи? Просто используйте 'await Task.WhenAll (langTask, eduTask, ...);'. Затем получите результат каждой завершенной задачи. Каждый раз, когда вы думаете, что вам нужно 'Wait' или' .Result', вы должны подумать, что вы на самом деле что-то не так сделали –

+0

Вы звоните в базу данных или веб-службу? В обоих случаях было бы быстрее (много) вернуть все связанные объекты в один вызов вместо того, чтобы пытаться загрузить их «параллельно». В таких вызовах обычно преобладают сетевые задержки. Вы будете тратить * одинаковое * время, но вызывают больше конфликтов на сервере и, возможно, запрашиваете/загружаете одни и те же строки таблицы 4 раза –

0

Нет необходимости создавать задачу и сразу же ее ждать, поэтому оставьте StartNew.

Также не нужно сначала Wait, а затем получить Result, Result неявно ждет. И этот метод не асинхронное на всех, и вы можете оставить async Task<> и непосредственно вернуть EmployeeDTO ...

1

У меня есть несколько методов, которые я хотел бы работать в параллельном и экстракта результате

На самом деле , вы хотите запустить их одновременно. «Параллель» подразумевает код с привязкой к процессору, но ваш код связан с I/O.

Итак, не используйте Parallel; это неправильный инструмент здесь:

public async Task<DTOs.EmployeeDTO> GetEmployeeInfo(int userId) 
{ 
    EmployeeDTO employee = new EmployeeDTO(); 

    // Start all tasks 
    var languagesTask = GetEmployeeLanguages(userId); 
    var educationsTask = GetEmployeesEducation(userId); 
    var outExperiencesTask = GetEmployeesOutExperience(userId); 
    var ubiExperiencesTask = GetEmployeesUbiExperience(userId); 

    // Asynchronously wait for them all to complete 
    await Task.WhenAll(languagesTask, educationsTask, outExperiencesTask, ubiExperiencesTask); 

    // Retrieve results 
    employee.Languages = await languagesTask; 
    employee.Educations = await educationsTask; 
    employee.OutExperiences = await outExperiencesTask; 
    employee.UbiExperiences = await ubiExperiencesTask; 

    return employee; 
} 

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

  • Нет связанных вопросов^_^