繁体   English   中英

在SignalR hub中创建Rx.NET Observable

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM