マルチキャスト処理にObservable.Publishを使用するライフサイクルについて少し混乱しています。どのように接続を正しく使用する必要がありますか?直感に反して、マルチキャストオブザーバーがサブスクリプションを開始するためにconnectを呼び出す必要がないことがわかりました。
var multicast = source.Publish();
var field0 = multicast.Select(record => record.field0);
var field1 = multicast.Select(record => record.field1);
// Do I need t*emphasized text*o call here?
var disposable = multicast.connect()
// Does calling
disposable.Dispose();
// unsubscribe field0 and field1?
編集
私のパズルは、IConnectableObservableでConnectを明示的に呼び出さなかったときに正常にサブスクライブできた理由です。ただし、暗黙的にConnectを呼び出すIConnectableObservableでAwaitを呼び出していました
Public Async Function MonitorMeasurements() As Task
Dim cts = New CancellationTokenSource
Try
Using dialog = New TaskDialog(Of Unit)(cts)
Dim measurementPoints =
MeasurementPointObserver(timeout:=TimeSpan.FromSeconds(2)).
TakeUntil(dialog.CancelObserved).Publish()
Dim viewModel = New MeasurementViewModel(measurementPoints)
dialog.Content = New MeasurementControl(viewModel)
dialog.Show()
Await measurementPoints
End Using
Catch ex As TimeoutException
MessageBox.Show(ex.Message)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Function
TaskDialogは、キャンセルボタンが押されたときにCancelObservedと呼ばれるオブザーバブルを公開することに注意してください。
解決
解決策は@astiによるリンクに投稿されています。これがそのリンクのRXチームからの引用です
awaitを使用すると、サブスクリプションが発生するため、監視可能なシーケンスがホットになります。このリリースには、IConnectableObservableのサポートが含まれています。これにより、シーケンスがソースに接続され、サブスクライブされます。Connect呼び出しがないと、await操作は完了しません。