我可以将Task.WhenAll()结果设置为Task.WhenAll()例程中的值吗?例如,以下代码将获取appRoleMaps中所有域/组组合的所有授权用户:
var results = await Task.WhenAll(appRoleMaps.Select(
x => GetAuthorizedUsers(x.DomainName, x.ADGroupName)));
但是,如果我要将每次迭代的授权用户结果设置为迭代项“授权”属性值,该怎么办?例如,类似以下代码的内容(尽管以下代码不起作用):
var results = await Task.WhenAll(appRoleMaps.Select(
x => x.AuthorizedUsers = GetAuthorizedUsers(x.DomainName, x.ADGroupName)));
是否有一种简化的方法?原因是,GetAuthorizedUsers结果集不包含域/组信息,因此我不能只做一个简单的foreach /在最后通过该信息轻松加入的地方
答案 0 :(得分:2)
保存任务并在等待后查询它们:
var tasks = appRoleMaps.Select(x => GetAuthorizedUsers(x.DomainName, x.ADGroupName)).ToList();
await Task.WhenAll(tasks);
var results = tasks.Select(t => t.Result).ToList();
这比依赖副作用更清洁。将值压缩为某些属性,然后将其提取出来,会使代码的含义变得晦涩难懂,并且需要编写更多代码。
答案 1 :(得分:1)
您可以创建一个异步lambda传递到您的app.get('/dogs', myFn('woof'));
app.get('/cats', myFn('meow'));
app.get('/birds', myFn('tweet'));
function myFn(word) {
return function(req, res, next) {
res.write(word).end();
}
}
中。这将导致将每个结果分配给关联实例上的Select
属性。仅需要外部AuthorizedUsers
知道何时已处理所有元素。
Task.WhenAll