2017-09-15 75 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'不会导致死锁。 (如果你不确定你在做什么,当然最好避免它) –