从Task.Run获取结果

问题描述 投票:-1回答:3

嗨,大家好我想从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;
}
c# .net asynchronous async-await task-parallel-library
3个回答
2
投票

我有多个方法,我想并行运行并提取结果

实际上,您希望同时运行它们。 “并行”意味着CPU绑定代码,但您的代码是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;
}

0
投票

创建任务并立即等待它是没有用的,所以放弃StartNew

也没有必要先Wait然后取ResultResult隐含等待。并且该方法根本不是异步的,您可以删除async Task<>并直接返回EmployeeDTO ...


-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;

}

如果您有任何其他建议或更好的方法,请分享。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.