如何并行化/异步此方法?

我正在尝试以不阻塞程序的方式编写此代码。 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,函数会立即执行,对吗?

所以我无法理解如何并行实现此计算。

liaoyi1107 回答:如何并行化/异步此方法?

只需创建嵌套异步操作以获得单个 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,您将在一个时刻创建一大堆任务。如果是这种情况,那么您可以另外对工作进行某种划分,将其划分为适当大小的块。

,

您无需并行执行即可不阻塞 UI。只是 consultas 异步方法调用。目前还不清楚 await 返回什么,但这样的操作不会阻塞 UI(假设该方法受 IO 限制并假设您的计算相当快):

GetKlinesAsync

如果您想并行运行调用以加快执行速度,您可以,但这不是防止方法调用阻塞调用线程所必需的。

考虑阅读有关 Task-based asynchronous programming 的 Microsoft 文档。如果您没有真正了解 public static async Task GetMinMaxValues(BinanceClient client,ObservableCollection<Coin> coins) { foreach (var coin in coins) { //Invokes asynchronous get method,waits for it to finish,and gets the result var result = await client.Spot.Market.GetKlinesAsync(coin.SymbolPair,KlineInterval.OneDay); //Use the result to set your coin values coin.MinVal = result.Data.Select(k => k.Low).Min(); coin.MaxVal = result.Data.Select(k => k.High).Max(); } } Tasksasync 在基本层面的工作原理,那么前面还有很多问题。

本文链接:https://www.f2er.com/1691.html

大家都在问