如何将Task.WhenAll()结果设置为Task.WhenAll()例程中的值?

时间:2018-07-09 20:34:10

标签: c# .net parallel-processing async-await

我可以将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 /在最后通过该信息轻松加入的地方

2 个答案:

答案 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