我有一个(经典的)SignalR集线器,它返回某些值的状态,并带有一个附加的客户端回调协定,该协定将更新发送给客户端。我基本上想在客户端(C#)上创建的是一个可观察的流,该流在第一个观察者连接时调用任务,然后开始进一步侦听回调协定上的更改。
服务器合同(伪):
interface IMyHub
Task<int> GetInitialInt();
interface IMyHubClient
void SendFurtherInts(int value);
客户端代理:
var client = hubConnection.CreateObservableHubProxy<IMyHub, IMyHubClient>();
我现在已经想到了这样的东西:
public IObservable<int> Value { get; }
var initialData = Observable.FromAsync(async () =>
await _client.CallAsync(client => client.GetInitialInt));
var stream = _client.Observe(client => client.SendFurtherInts)
.StartWith(initialData)
.Publish()
.RefCount(1);
stream.Connect();
Value = stream.AsObservable();
StartWith()
但是希望枚举现有值,而不是单个值或流。 .Prepend()
似乎也不适用于流。从技术上讲,我可以先调用该任务,然后创建流,但这既没有功能,也不能满足我的需求(当第一个观察者连接时调用)。
解决这个问题的正确方法是什么?