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.

Manejador de eventos vs Tema Rx

Estoy usando System.Reactive y no sé cuál elegir: ¿EventHandlers o Subjects? ¿Cuál es la diferencia entre ellos?

var client = WebSocketClient.Create(uri);

// Subject
client.OnConnected
.Subscribe(_ => { Log.Information($”Socket {client.Id} connected”); })
.DisposeWith(disposable);

// EventHandler
Observable
.FromEventPattern(h => client.Connected += h, h => client.Connected -= h)
.Select(_ => Unit.Default)
.Subscribe(_ => { Log.Information($”Socket {client.Id} connected”); })
.DisposeWith(disposable);

“`cs
public class WebSocketClient : IWebSocketClient
{
// Subject
private readonly ISubject<unit> _connectedSubject = new Subject<unit>();

<pre><code>public IObservable<unit> OnConnected => _connectedSubject.AsObservable();

// EventHandler
private EventHandler? _connected;

public event EventHandler Connected
{
add => _connected += value;
remove => _connected -= value;
}

// Lógica
async Task IWebSocketClient.ConnectAsync(CancellationToken cancellationToken)
{

await _webSocket.ConnectAsync(_uri, cancellationToken).ConfigureAwait(false);

_connected?.Invoke(this, EventArgs.Empty);

_connectedSubject.OnNext();


}

private void Dispose()
{
_connectedSubject.OnCompleted();
}
</code></pre>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La principal diferencia entre EventHandlers y Subjects en System.Reactive es que los EventHandlers son una forma de convertir una API basada en eventos en una secuencia observable, mientras que los Subjects son una forma de crear manualmente una secuencia observable y enviar datos a la misma.

    Observable.FromEventPattern es un método de fábrica que toma dos expresiones lambda, una para suscribirse a un evento (client.Connected += h) y otra para cancelar la suscripción (client.Connected -= h), y devuelve una secuencia observable que produce objetos EventPattern<teventargs>. Esto te permite suscribirte a un evento de manera reactiva y utilizar todos los operadores disponibles en System.Reactive.

    Por otro lado, un Subject es un tipo que implementa tanto IObserver<t> como IObservable<t>. Te permite enviar datos manualmente a través de él (usando OnNext) y suscribirte a él como lo harías con cualquier otra secuencia observable. En el fragmento de código, _connectedSubject es un subject que se utiliza para enviar una sola unidad de datos (Unit.Default) cada vez que se produce el evento Connected.

    En resumen, si estás trabajando con una API existente basada en eventos, puedes utilizar Observable.FromEventPattern para convertir los eventos en secuencias observables. Si necesitas crear manualmente una secuencia observable y enviar datos a la misma, puedes utilizar un Subject.

Comments are closed.