이것은 잠재적으로 매우 어리석은 질문이지만 Linq 확장 메서드로 생성 된 IObservables를 유지해야하는지 잘 모르겠습니다. 대부분의 예제는 기본적으로 그렇게 보이지만 장시간 실행되는 프로그램에서는 어떻게 될 것입니다. 내 질문을 설명하는 두 가지 예제가 있습니다 :'Linqed'의 수명 반향 식을 사용하여 IObservable
내 첫 번째, 현재 기본 구현은 pub \ sub 이벤트 수집기에서 제공하는 IObservable 구독을 포함합니다. 관측기가 집계자가있는 한 주위에있을 것이라는 것을 알고 있기 때문에 나는 이것에 익숙하다.
IDisposable altSendSubscription = Events.GetStream<OutgoingByteMessage>()
.Where(msg => msg.Identifier.ChannelId == this.Id)
.Select(msg => Tuple.Create(msg.Identifier.ConnectionId, msg.Data))
.Subscribe(item =>
{
_sendQueue.Enqueue(item);
});
내 질문은, 그 두 번째 버전에, 나는 유지해야한다 : 그 논리의 일부를 분해 Linq를 사용하는 경우
protected virtual void SubscribeToEvents()
{
_subscriptions.Dispose();
_subscriptions = new CompositeDisposable();
IDisposable sendSubscription = Events.GetStream<OutgoingByteMessage>()
.Subscribe(msg =>
{
if (msg.Identifier.ChannelId == this.Id)
{
var queueItem = Tuple.Create(msg.Identifier.ConnectionId, msg.Data);
_sendQueue.Enqueue(queueItem);
}
});
_subscriptions.Add(sendSubscription);
}
그러나, 나는 가입을 얻기 위해이 작업을 수행 할 수 있습니다 저것의 제품. 선택 방법? 이것은 afterall에서 일어나는 일입니다. 기술적으로 IObservable은 SubscribeToEvents가 완료되고 가비지 수집을받을 수있게되면 즉시 범위를 벗어납니다. 또는 IDisposable 개체 자체에 대한 참조를 유지하므로 특정 참조를 어딘가에 보관하지 않아도 안전합니다.
Rx 소스를 살펴본 후 Linq 마법을 달성하기 위해 일련의 전달자 클래스를 사용하는 것처럼 보입니다. 그러나 나는 아직도 약간 편집증을 앓고 있습니다. 너희들은 어떻게 생각하니?