C#ForEach循环具有ASync任务和相关的后期ASync任务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#ForEach循环具有ASync任务和相关的后期ASync任务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2283字,纯文字阅读大概需要4分钟。
内容图文
我无法正确地构建最有效的方法来迭代从请求对象启动的几个异步任务,然后执行一些依赖于请求对象和第一个异步任务的结果的其他异步任务.我正在AWS中运行C#lambda函数.我尝试过这样的模型(为简洁起见,省略了错误处理等):
public async Task MyAsyncWrapper()
{
List<Task> Tasks = new List<Task>();
foreach (var Request in Requests)
{
var Continuation = this.ExecuteAsync(Request).ContinueWith(async x => {
var KeyValuePair<bool, string> Result = x.Result;
if (Result.Key == true)
{
await this.DoSomethingElseAsync(Request.Id, Request.Name, Result.Value);
Console.WriteLine("COMPLETED");
}
}
Tasks.Add(Continuation);
}
Task.WaitAll(Tasks.ToArray());
}
这种方法导致DoSomethingElseAsync()方法没有真正等待我的Lambda函数调用,我从来没有得到“COMPLETED”输出.我也用这种方法解决了这个问题:
public async Task MyAsyncWrapper()
{
foreach (var Request in Requests)
{
KeyValuePair<bool, string> Result = await this.ExecuteAsync(Request);
if (Result.Key == true)
{
await this.DoSomethingElseAsync(Request.Id, Request.Name, Result.Value);
Console.WriteLine("COMPLETED");
}
}
}
这是有效的,但我认为这很浪费,因为我只能在等待asnyc完成时执行循环的一次迭代.我也引用了Interleaved Tasks,但问题是我基本上有两个循环,一个用于填充任务,另一个用于在完成后迭代它们,在那里我不再能够访问原始的Request对象.基本上这个:
List<Task<KeyValuePair<bool, string>>> Tasks = new List<Task<KeyValuePair<bool, string>>>();
foreach (var Request in Requests)
{
Tasks.Add(ths.ExecuteAsync(Request);
}
foreach (Task<KeyValuePair<bool, string>> ResultTask in Tasks.Interleaved())
{
KeyValuePair<bool, string> Result = ResultTask.Result;
//Can't access the original request for this method's parameters
await this.DoSomethingElseAsync(???, ???, Result.Value);
}
有关在foreach循环中实现此类异步链接的更好方法的任何想法?我理想的方法不是将请求对象作为ExecuteAsync()响应的一部分返回,所以我想尽可能尝试找到其他选项.
解决方法:
我可能会误解,但为什么不将你的“迭代”移动到它自己的函数中,然后使用Task.WhenAll来并行地等待所有迭代.
public async Task MyAsyncWrapper()
{
var allTasks = Requests.Select(ProcessRequest);
await Task.WhenAll(allTasks);
}
private async Task ProcessRequest(Request request)
{
KeyValuePair<bool, string> Result = await this.ExecuteAsync(request);
if (Result.Key == true)
{
await this.DoSomethingElseAsync(request.Id, request.Name, Result.Value);
Console.WriteLine("COMPLETED");
}
}
内容总结
以上是互联网集市为您收集整理的C#ForEach循环具有ASync任务和相关的后期ASync任务全部内容,希望文章能够帮你解决C#ForEach循环具有ASync任务和相关的后期ASync任务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。