c# - 如何并行化/异步此方法?
问题描述
我正在尝试以不阻止程序的方式编写此代码。client.Spot.Market.GetKlinesAsync 支持 await 但不确定如何构造代码以便可以等待。
public static async Task GetMinMaxValues ( BinanceClient client, ObservableCollection<Coin> coins )
{
foreach ( var coin in coins )
{
var task = client.Spot.Market.GetKlinesAsync ( coin.SymbolPair, KlineInterval.OneDay );
coin.MinVal = klines.Result.Data.Select ( k => k.Low ).Min ( );
coin.MaxVal = klines.Result.Data.Select ( k => k.High ).Max ( );
}
}
让我感到困惑的是如何实现这一点,因为我需要能够计算最小值和最大值。因此,如果我访问 Result,该函数会立即执行,对吗?
所以我无法理解如何并行实现这种计算。
解决方案
只需创建嵌套异步操作以获取 single 的 min/max Coin
,然后并行运行:
public static async Task GetMinMaxValues ( BinanceClient client,
ObservableCollection<Coin> coins )
{
await Task.WhenAll(coins.Select(async c=>await GetMinMax(c, client)).ToList());
}
public static async Task GetMinMax(Coin coin, BinanceClient client)
{
var res = await client.Spot.Market.GetKlinesAsync ( coin.SymbolPair );
coin.MinVal = klines.Result.Data.Select ( k => k.Low ).Min ( );
coin.MaxVal = klines.Result.Data.Select ( k => k.High ).Max ( );
}
这种方法的危险可能是,如果你有很多Coins
,你会在一个时刻创建一大堆任务。如果是这种情况,那么您可以另外对适当大小的块执行某种类型的工作分区。
推荐阅读
- python - 如何在另一个 sys.argv 之前制作多个 sys.argv
- powerbuilder - 更改小数和千位分隔符后导入数值数据
- php - 在 php 中使用 union 排序
- python - 如何将任务结果从 Celery 客户端代码存储到数据库?
- android - 开始新活动时使用 Glide
- apache-spark - PySpark 中的连接列表
- angular - 如何在提交表单时关闭 ngboostrap 模型?
- c# - Azure Bot Framework:处理用户发送多条连续消息
- google-drive-api - 用于创建驱动器推送通知通道和获取更改列表的 get start Page Token 是否相同?
- python-3.x - 从 redis-cli 访问的数据和 python 不同