2016-12-07 6 views
-1

Hallo Jungs, ich bin versucht, einige Ergebnisse aus Task.Run zu bekommen, aber ich kann es nicht verstehen, wieErste resultieren aus Task.Run

ich mehrere Methoden, die Ich mag würde parallel und Extrakt Ergebnis auszuführen: Dies ist eine der Methoden

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

Hier, in der alle Methoden parallel

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

Danke

ausgeführt werden
+2

Warum rufen Sie einfach nicht 'var result = erwarten EducationService.GetEducationsByUserId (userId);'? –

+0

@ bash.d Seine 'GetEmployeesEducation' Methode ist nicht asynchron. Obwohl es wahrscheinlich sein sollte. – ThePerplexedOne

+0

@ThePerplexedOne Danke, habe das nicht gesehen. Aber es würde Sinn machen, nehme ich an. –

Antwort

-2

Das ist also

meine Suche nach
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; 

} 

Wenn Sie weitere Vorschläge haben, oder ein besserer Ansatz bitte teilen. Vielen Dank.

+2

Nachschlagen 'Task.WhenAll' und verwenden Sie es anstelle der parallelen Aufruf –

+3

Warum Parallel.Invoke verwenden, wenn Sie bereits alle Ihre Aufgaben zur Hand haben? Verwenden Sie einfach 'awar Task.WhenAll (langTask, eduTask, ...);'. Dann erhalte das Ergebnis jeder abgeschlossenen Aufgabe. Jedes Mal, wenn Sie denken, Sie brauchen 'Wait' oder' .Result', sollten Sie bedenken, dass Sie etwas falsch machen –

+0

Rufen Sie eine Datenbank oder einen Webservice an? In beiden Fällen wäre es schneller (viel), alle verwandten Objekte in einem einzigen Aufruf zurückzugeben, anstatt zu versuchen, sie "parallel" zu laden. Solche Anrufe werden normalerweise von Netzwerklatenzen dominiert. Sie verbringen die * gleiche * Zeit, verursachen aber größere Konflikte auf dem Server und fragen/laden wahrscheinlich dieselben Tabellenzeilen viermal –

0

Es macht keinen Sinn, eine Aufgabe zu erstellen und sofort darauf zu warten, also lassen Sie die StartNew fallen.

Auch keine Notwendigkeit, zuerst Wait und dann holen Sie die Result, Result implizit wartet. Und das Verfahren ist überhaupt nicht asynchron und Sie können async Task<> fallen und direkt Rückkehr der EmployeeDTO ...

1

Ich habe mehrere Methoden, die Ich mag würde parallel und Extrakt Ergebnis laufen

Eigentlich , möchten Sie sie gleichzeitig ausführen. "Parallel" impliziert CPU-gebundenen Code, aber Ihr Code ist I/O-gebunden.

Also, verwenden Sie nicht Parallel überhaupt; es ist das falsche Werkzeug hier:

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