2016-12-07 136 views
-1

嗨,大家好我想要得到Task.Run了一定的成果,但我不明白它是如何獲取結果從Task.Run

我有多種方法,我想在並行和提取結果運行: 這是所有方法將在並行

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

運行的方法

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

在這裏,人們謝謝

+2

爲什麼不簡單地調用'var result = await EducationService.GetEducationsByUserId(userId);'? –

+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

查找'Task.WhenAll'並使用它代替並行調用 –

+3

爲什麼在您已經完成所有任務時使用Parallel.Invoke?只需使用'await Task.WhenAll(langTask,eduTask,...);'。然後獲取每個完成的任務的結果。每次你認爲你需要'等待'或'.Result'時,你應該考慮你實際上做了什麼錯誤 –

+0

你在調用數據庫還是Web服務?在這兩種情況下,在一次調用中返回所有相關對象會更快(很多),而不是試圖「並行」加載它們。這種調用通常受網絡延遲的影響。您將花費相同的*時間,但會在服務器上引發更大的爭用,並且可能會查詢/加載相同的錶行4次 –

0

創建任務並立即等待它沒有用,因此請刪除StartNew

也不需要先Wait然後取Result,Result隱式等待。而該方法不是異步的一切,你可以刪除async Task<>,並直接返回EmployeeDTO ...

1

我有多種方法,我想在並行和提取結果運行

其實,你想同時運行它們。 「並行」意味着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; 
}