无法从任务列表中获取结果

Nig*_*gor 5 c# async-await

我有这个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想获得所有设置,然后等到所有设置完成后才这样

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 :(
    }
}
Run Code Online (Sandbox Code Playgroud)

如何从任务中获取数据?

Sal*_*ari 7

更改您的taskListList<Task<SettingModel>>,也不要使用task.Result以避免死锁.你的代码应该是这样的:

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

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

var result = await Task.WhenAll(taskList.ToList()).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

  • 由于在OP的情况下`await Task.WhenAll`等待所有任务,`.Result`不会导致死锁.(如果你不确定你在做什么,当然最好避免它) (2认同)