es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

System.Reactive – Eliminando una cantidad desconocida de suscripciones al mismo tiempo.

Tengo una cantidad desconocida de suscripciones que me gustaría desechar de una sola vez, porque podrían ser muchas. ¿Hay algún mecanismo para desecharlos todos a la vez usando System.Reactive? ¿Quizás envolverlos en Observable.Using(() => Disposable.Create... funcionaría?

Aquí está lo que realmente son estas suscripciones.

public class BinanceClientStreams
{
    internal readonly Subject<PongResponse> PongSubject = new Subject<PongResponse>();

    internal readonly Subject<TradeResponse> TradesSubject = new Subject<TradeResponse>();
    internal readonly Subject<AggregatedTradeResponse> TradeBinSubject = new Subject<AggregatedTradeResponse>();

    internal readonly Subject<OrderBookPartialResponse> OrderBookPartialSubject =
        new Subject<OrderBookPartialResponse>();

    internal readonly Subject<OrderBookDiffResponse> OrderBookDiffSubject = new Subject<OrderBookDiffResponse>();
    internal readonly Subject<FundingResponse> FundingSubject = new Subject<FundingResponse>();

    internal readonly Subject<BookTickerResponse> BookTickerSubject = new Subject<BookTickerResponse>();

    internal readonly Subject<KlineResponse> KlineSubject = new Subject<KlineResponse>();

    internal readonly Subject<MiniTickerResponse> MiniTickerSubject = new Subject<MiniTickerResponse>();

    // PUBLIC

    /// <summary>
    /// Response stream to every ping request
    /// </summary>
    public IObservable<PongResponse> PongStream => PongSubject.AsObservable();

    /// <summary>
    /// Trades stream - emits every executed trade on Binance
    /// </summary>
    public IObservable<TradeResponse> TradesStream => TradesSubject.AsObservable();

    /// <summary>
    /// Chunk of trades - emits grouped trades together
    /// </summary>
    public IObservable<AggregatedTradeResponse> AggregateTradesStream => TradeBinSubject.AsObservable();

    /// <summary>
    /// Partial order book stream - emits small snapshot of the order book
    /// </summary>
    public IObservable<OrderBookPartialResponse> OrderBookPartialStream => OrderBookPartialSubject.AsObservable();

    /// <summary>
    /// Order book difference stream - emits small snapshot of the order book
    /// </summary>
    public IObservable<OrderBookDiffResponse> OrderBookDiffStream => OrderBookDiffSubject.AsObservable();

    /// <summary>
    /// Mark price and funding rate stream - emits mark price and funding rate for a single symbol pushed every 3 seconds or every second
    /// </summary>
    public IObservable<FundingResponse> FundingStream => FundingSubject.AsObservable();

    /// <summary>
    ///  The best bid or ask's price or quantity in real-time for a specified symbol
    /// </summary>
    public IObservable<BookTickerResponse> BookTickerStream => BookTickerSubject.AsObservable();

    /// <summary>
    /// The Kline/Candlestick subscription, provide symbol and chart intervals
    /// </summary>
    public IObservable<KlineResponse> KlineStream => KlineSubject.AsObservable();

    /// <summary>
    /// Mini-ticker specified symbol statistics for the previous 24hrs
    /// </summary>
    public IObservable<MiniTickerResponse> MiniTickerStream => MiniTickerSubject.AsObservable();
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para desechar todas las suscripciones de una sola vez, puedes utilizar la clase CompositeDisposable del espacio de nombres System.Reactive.Disposables. Esta clase te permite combinar múltiples objetos IDisposable y desecharlos todos a la vez.

    Primero, crea una nueva instancia de la clase CompositeDisposable:

    var disposable = new CompositeDisposable();
    

    Luego, añade todas tus suscripciones al objeto disposable:

    disposable.Add(client.Streams.PongStream.Subscribe(x =>
        Log.Information($"Pong recibido ({x.Message})")));
    
    disposable.Add(client.Streams.FundingStream.Subscribe(response =>
    {
        var funding = response.Data;
        Log.Information($"Financiamiento: [{funding.Symbol}] tasa:[{funding.FundingRate}] " +
                        $"precio marcado: {funding.MarkPrice} próximo financiamiento: {funding.NextFundingTime} " +
                        $"precio índice {funding.IndexPrice}");
    }));
    
    // Añade todas las otras suscripciones de manera similar
    

    Ahora, puedes desechar todas tus suscripciones de una sola vez llamando simplemente al método Dispose en el objeto CompositeDisposable:

    disposable.Dispose();
    

    Esto desechará todas las suscripciones que añadiste al objeto CompositeDisposable.

Comments are closed.