C# で .NET の RX ライブラリをいじっています。次のコードで「observer.OnCompleted()」メソッドが何もしない理由を誰かに説明してもらえますか:
var observableStream = Observable.Create<CustomMessage>(
(observer) =>
{
CustomMessage cm = new CustomMessage();
CustomMessage.Subscribe(observer.OnNext);
return Disposable.Create(
() =>
{
Console.WriteLine("Disposing...");
CustomMessage.Unsubscribe(observer.OnNext);
observer.OnCompleted(); //***Nothing happens here***
}
);
});
//IObserver.OnException()
public override void OnException(Exception e)
{
Console.WriteLine("Exception occurred - " + e.Message);
}
//IObserver.OnComplete()
public override void OnUnsubscribe()
{
Console.WriteLine("Unsubscribed...");
}
//IObserver.OnNext()
public override void HandleNextMsg(IRVMessage msg)
{
Console.WriteLine("Instance received a message");
}
IDisposable myDisposable = observableStream.Subscribe(HandleNextMsg, OnException, OnUnsubscribe);
//At some later point....
myDisposable.Dispose();
このコードは、CustomMessages のストリームへのサブスクリプションを作成することを目的としています。サブスクリプションを設定するときに、observer.OnNext() メソッドを CustomMessage タイプに登録します。次に、サブスクリプションを破棄するときに、observer.OnNext() の登録を解除します。これはすべて正しく機能します。私の 'HandleNextMsg()' メソッドは、CustomMessage が受信されるたびに呼び出されます。
後でサブスクリプションを終了したいときに「Dispose()」を呼び出すと、次の 2 行が正常に実行されます。
Console.WriteLine("Disposing...");
CustomMessage.Unsubscribe(observer.OnNext);
その後、CustomMessages を受信しなくなりました。ただし、次の行は実行されますが、何もしません。
observer.OnCompleted();
私はそれが次の行を呼び出すことを期待していました:
Console.WriteLine("Unsubscribed...");
ある時点で、オブザーバーと 'OnUnsubscribe' メソッドの間の接続が失われ、何が起こっているのか正確に理解したいと思います。「observer.OnNext()」は正常に登録解除できるのに、「observer.OnCompleted()」は何もしないのはどうしてですか?
ストリームを破棄しているからといって、「OnCompleted()」を呼び出す必要があるわけではないという指摘を受けましたが、それでも機能しない理由を理解したいと思います。