簡體   English   中英

如何使用異步等待並行化此代碼

[英]How to parallelize this code using async await

我試圖更好地理解異步編程。 我編寫了這段代碼並添加了異步,但速度仍然相同。 每個訂閱調用都需要一秒鍾以上的時間,所以當我在控制台中打印它時,它仍然在同步工作。

我想要的只是異步執行每個訂閱調用。 另外因為第一個 function 有很多訂閱調用,我不確定那應該是異步的還是應該異步第二個調用。 因為在程序開始時,我要調用第一個 function 之類的 50 次。 后來我只在添加新項目時調用第一個 function 1 次。

public static List<Task<CallResult<UpdateSubscription>>> AddNewSubscription(
    BinanceSocketClient socketClient, Coin coin)
{
    List<Task<CallResult<UpdateSubscription>>> tasks =
        new List<Task<CallResult<UpdateSubscription>>>();
    List<UpdateSubscription> subs = new List<UpdateSubscription>();

    var sub = socketClient.Spot.SubscribeToSymbolTickerUpdatesAsync(coin.SymbolPair,
        data =>
    {
        coin.Price = data.LastPrice;
        coin.LowestDailyPrice = data.LowPrice;
        coin.HighestDailyPrice = data.HighPrice;
        coin.PriceChangeInPercentDaily = data.PriceChangePercent;
    });
    tasks.Add(sub);
    subs.Add(sub.Result.Data);

    sub = socketClient.Spot.SubscribeToKlineUpdatesAsync(coin.SymbolPair,
        KlineInterval.OneHour, data =>
    {
        coin.LastHourOpenPrice = data.Data.Open;
        coin.LastHourVolume = data.Data.BaseVolume;
        coin.TotalBuyVolume = data.Data.TakerBuyBaseVolume;
        coin.TotalSellVolume = coin.LastHourVolume - coin.TotalBuyVolume;
    });
    tasks.Add(sub);
    subs.Add(sub.Result.Data);

    sub = socketClient.Spot.SubscribeToKlineUpdatesAsync(coin.SymbolPair,
        KlineInterval.OneMinute, data =>
    {
        coin.LastMinuteOpenPrice = data.Data.Open;
    });
    tasks.Add(sub);
    subs.Add(sub.Result.Data);

    Utility.ActiveSubscriptions.Add(coin.Symbol, subs);

    return tasks;
}

public static async Task AddNewSubscriptions(BinanceSocketClient socketClient,
    IEnumerable<Coin> coins)
{
    List<Task<CallResult<UpdateSubscription>>> tasks =
        new List<Task<CallResult<UpdateSubscription>>>();
    int index = 0;

    foreach (var coin in coins)
    {
        var subs = Utility.AddNewSubscription(socketClient, coin);
        Console.WriteLine("{0}/{1} : {2}", index, coins.Count(), coin.Symbol);
        ++index;

        tasks.Union(subs);
    }

    //foreach(var task in tasks)
    //  Utility.ActiveSubscriptions.Add ( coin.Symbol, task.Result.Data );

    await Task.WhenAll(tasks);
}




public async static Task<List<CallResult<UpdateSubscription>>> AddNewSubscription ( BinanceSocketClient socketClient, IEnumerable<Coin> coins )
{
    var tasks = new List<Task<CallResult<UpdateSubscription>>> ( );
    var taskdict = new Dictionary<string, List<Task<CallResult<UpdateSubscription>>>> ( );

    foreach ( var coin in coins )
    {
        var subtasks = Utility.CreateSubscriptionTasks ( socketClient, coin );
        tasks.AddRange ( subtasks );

        taskdict.Add ( coin.Symbol, subtasks );
    }

    await Task.WhenAll ( tasks );

    foreach ( var task in taskdict )
    {
        var subs = task.Value.Select ( x => x.Result.Data ).ToList ( );
        Utility.ActiveSubscriptions.Add ( task.Key, subs );
    }

    return tasks.Select ( x => x.Result ).ToList ( );
}

不要調用.Result除非你想阻塞線程並等待結果。 在這種情況下,您可能不希望在所有任務都已啟動之后才等到最后的結果。

public static List<Task<CallResult<UpdateSubscription>>> AddNewSubscription ( BinanceSocketClient socketClient, Coin coin )
{
    var tasks = new List<Task<CallResult<UpdateSubscription>>> ( );

    var sub = socketClient.Spot.SubscribeToSymbolTickerUpdatesAsync ( coin.SymbolPair, data =>
    {
        coin.Price = data.LastPrice;
        coin.LowestDailyPrice = data.LowPrice;
        coin.HighestDailyPrice = data.HighPrice;
        coin.PriceChangeInPercentDaily = data.PriceChangePercent;
    } );
    tasks.Add ( sub );

    sub = socketClient.Spot.SubscribeToKlineUpdatesAsync ( coin.SymbolPair, KlineInterval.OneHour, data =>
    {
        coin.LastHourOpenPrice = data.Data.Open;
        coin.LastHourVolume = data.Data.BaseVolume;
        coin.TotalBuyVolume = data.Data.TakerBuyBaseVolume;
        coin.TotalSellVolume = coin.LastHourVolume - coin.TotalBuyVolume;
    } );
    tasks.Add ( sub );

    sub = socketClient.Spot.SubscribeToKlineUpdatesAsync ( coin.SymbolPair, KlineInterval.OneMinute, data =>
    {
        coin.LastMinuteOpenPrice = data.Data.Open;
    } );
    tasks.Add ( sub );

    //Here is where we wait for them all to complete in parallel
    Task.WaitAll( tasks );
    var subs = tasks.Select( x => x.Result.Data ).ToList(); 

    Utility.ActiveSubscriptions.Add ( coin.Symbol, subs );

    return tasks;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM