c# - 从异步方法将项目添加到列表

标签 c# asp.net .net azure-service-fabric

我需要从服务结构中的分区返回项目并将它们添加到列表中。结果来自异步方法。我试图了解正在发生的事情以使其运行得更快。循环是等到为每个 GetItems 返回 await,还是继续循环并为下一个分区启动新的 GetItems?

List<string> mylist = new List<string>();

foreach(var partition in partitions)
{
   var int64RangePartitionInformation = p.PartitionInformation as Int64RangePartitionInformation;
   if (int64RangePartitionInformation == null) continue;
   var minKey = int64RangePartitionInformation.LowKey;
   var assetclient = ServiceProxy.Create<IService>(serviceName, new ServicePartitionKey(minKey));
   var assets = await assetclient.GetItems(CancellationToken.None);
   mylist.AddRange(items)
}

最佳答案

await 关键字告诉编译器将您的方法重构为状态机。一旦您的 async 方法被调用,第一个 await 之前的所有内容都将被执行。其余任务将被注册为延迟执行,并且根据当前配置可以立即同步执行或在另一个线程上执行。

如果等待的任务是异步执行的,则实际的方法调用返回,因此线程可以自由地做任何其他事情,例如。刷新用户界面。这个重构后的类似状态机的方法会被一次又一次地调用,轮询等待的任务是否完成。一旦完成,状态就会切换,等待行之后的代码将被执行,依此类推。

所以逻辑上是的,循环一直等到结果出现,但实际上线程并没有因为上面提到的类似状态机的行为而被阻塞。

查看详细解释here .

更新:

如果可以从所有分区并行得到结果,就不要一个一个等待。相反,使用 Parallel.ForEach 或只是在您的 foreach 循环中填充一个 Task 集合,最后一步等待它们:

await Task.WhenAll(myTasks);

关于c# - 从异步方法将项目添加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39489269/

相关文章:

c# - 用于从 SQL 查询中提取列定义的正则表达式

c# - 在 Set 方法中解析

asp.net - ScriptManager.RegisterStartupScript 不适用于 ASP 按钮单击事件

.net - 带有页面刷新和书签的 ASP.NET ViewState 回发

.net - 如何使用正则表达式在其他两个字符串之间找到一个字符串?

javascript - 通过 AJAX 在 Javascript 中传递 & 符号

c# - 如何制作派生方法,它采用与 C# 中的重写函数不同的参数?

c# - 正确了解异步/等待。正确吗?

c# - 在 C# 的中继器中选择 CheckBox 时如何避免页面刷新?

.net - 服务模型和 f#