2017-09-15 41 views
5

我有這個async函數返回一個Task無法從任務列表中導致

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

現在,我想所有的設置,然後等待直到所有完成這樣

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 :(
    } 
} 

如何從任務中獲取數據?

+5

我在想'taskList'應該有'List >'類型。 –

+0

task.run在哪裏發生? –

+0

@ C.Gonzalez無處。沒有理由在這裏調用Task.Run。 – Servy

回答

5

將您的taskList更改爲List<Task<SettingModel>>並且也不要使用task.Result以避免Deadlock。你的代碼應該是這樣的:

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

因爲所有的任務都是在OP的情況下在await Task.WhenAll中等待的,所以'.Result'不會導致死鎖。 (如果你不確定你在做什麼,當然最好避免它) –