2017-09-15 19 views
5

mam to async funkcja, która zwraca TaskNie można uzyskać wynik z listy zadań

public async Task<SettingModel> GetSetting(string key) 
{ 
    var rootPath = _hostingEnvironment.ContentRootPath; 
    using (StreamReader r = new StreamReader(rootPath + key + "settings.json")) 
    { 
     string json = await r.ReadToEndAsync(); 
     var settings = JsonConvert.DeserializeObject<SettingModel>(json); 
     return settings; 
    } 
} 

Teraz chcę, aby wszystkie ustawienia, a następnie poczekać, aż wszystko zostanie zakończone jak ten

public async Task GetData(List<string> keys) 
{ 
    var taskList = new List<Task>(); 
    foreach(var key in keys) 
    { 
     taskList.Add(GetSetting(key)); 
    } 

    await Task.WhenAll(taskList.ToList()); 

    foreach (var task in taskList) 
    { 
     task.Result // here its not working. The task don't have a result :(
    } 
} 

Jak uzyskać dane z zadania?

+5

Myślę, że 'taskList' powinien mieć typ' List > '. –

+0

Gdzie jest task.run dzieje? –

+0

@ C.Gonzalez Nigdzie. Nie ma powodu, aby wywoływać 'Task.Run' tutaj. – Servy

Odpowiedz

5

Zmień swój taskList na List<Task<SettingModel>>, a także nie używaj task.Result, aby uniknąć Deadlock. Twój kod powinien wyglądać mniej więcej tak:

var taskList = new List<Task<SettingModel>>(); 

foreach(var key in keys) 
{ 
    taskList.Add(GetSetting(key)); 
} 

var result = await Task.WhenAll(taskList.ToList()).ConfigureAwait(false); 
+2

Ponieważ wszystkie zadania oczekują w 'await Task.WhenAll' w przypadku OP,' .Result' nie spowoduje zakleszczenia. (Oczywiście lepiej tego unikać, jeśli nie jesteś pewien co robisz) –