[英]Create Rx.NET Observable in SignalR hub
我有一个SignalR集线器,它监听客户端请求并使用Rx.NET观察数据库表,以便一旦可用就将更新发送回请求它们的客户端。 但看起来根据客户端请求在集线器中创建的Observer
实例在方法调用完成后会被销毁(由GC?); 因此,我没有更新。
这是我当前的Hub
实现:
public class BookHub : Hub {
private readonly BookService _service = new BookService();
public void RequestBookUpdate(string author) {
BookObserver observer = new BookObserver(Context.connectionId);
IDisposable unsubscriber = _service.RequestBookUpdate(author, observer);
}
}
BookService
返回转换为Observable
的LINQ查询:
public IDisposable RequestBookUpdate(string author, BookObserver observer) {
var query = from b in db.Book where b.Author.Contains(author) select b;
IObservable<Book> observable = query.ToObservable();
IDisposable unsubscriber = observable.Subscribe(observer);
return unsubscriber;
}
BookObserver
只是将新检索的项目发送回请求更新的特定客户端(由connectionId
标识):
// omissis
private static readonly IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<BookHub>();
private readonly string _connectionId;
public BookObserver(string connectionId) {
connectionId = _connectionId:
}
public void OnNext(Book value) {
_context.Clients.Client(_connectionId).foundNewBook(value);
}
我不关心正在销毁的BookService
实例,但是我希望BookObserver
保持活动状态,所以我只能在客户端断开连接时调用unsubscriber.Dispose()
。 这可能吗?
Observer
在收到对OnComplete
的调用时会自动处理。 这实际上是一个非常好的模式,因为这意味着您不必像这样手动处理Subscription
:
Observable.Range(0, 100)
.Subscribe(...);
要么
Observable.Interval(TimeSpan.FromSeconds(1))
.Take(10)
.Subscribe();
因此,以确保直到它希望被布置你的观察者没有得到处置,你可以Concat的另一个空,从来没有完成的,可观察到源。
IObservable<Book> observable = query.ToObservable()
.Concat(Observable.Never<Book>());
但是,根据您尝试执行的操作,在其他位置处理此操作可能会更好,例如客户端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.