Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用可从信号器观察到的共享IObservable_C#_Asp.net_Signalr_System.reactive - Fatal编程技术网

C# 使用可从信号器观察到的共享IObservable

C# 使用可从信号器观察到的共享IObservable,c#,asp.net,signalr,system.reactive,C#,Asp.net,Signalr,System.reactive,假设我有一个IObservableserverside,存储在一个静态字段或任何东西中 我们还假设我有一个signarhub,它有一个Subscribe方法,还有一个signarclient,它有一个notify功能 public static IObservable<string> Events; protected void Application_Start() { //dummy observable just to generate events for me..

假设我有一个
IObservable
serverside,存储在一个静态字段或任何东西中

我们还假设我有一个signarhub,它有一个
Subscribe
方法,还有一个signarclient,它有一个
notify
功能

public static IObservable<string> Events;
protected void Application_Start()
{
   //dummy observable just to generate events for me..
   Events = Observable
       .Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(50))
       .Select(l => l.ToString());
...snip..
}
以及:

我需要做什么才能让所有客户共享可观察到的内容? 也就是说,我希望每个连接的客户端在订阅后都能接收最近200个事件。然后,每个客户机都应该实时记录相同的事件

我想应该以某种方式使用IObservable的
Replay
方法。 我希望它的行为类似于聊天,用户可以实时查看最后x条消息+每个新事件


除了如何实际组合可观察的查询外,在Asp.NET中存储和设置共享事件流的最佳方法是什么?

这是一个非常常见的体系结构问题-将实时流与“世界状态”相结合。您要做的是利用SignalR向当前订阅者广播实时消息(它擅长的是),并使用单独的API调用加入客户端以获取历史消息

在客户机中,您提供的逻辑首先订阅live Signal消息流,然后请求已经发生的消息的历史记录(“世界状态”)——通常最好作为简单的有序列表向后拉

存在一种固有的竞争条件,可能导致在实时流和历史记录中接收消息-因此您必须注意消除重复或“消除重复”您的消息列表

如何持久化消息可以作为一个完全独立的问题来处理

历史和实时流的这种分离提供了处理这两者的灵活性,并提供了提高效率的机会,例如,翻页到历史,而不是抓住整个过程

有几个问题和答案讨论了如何利用Rx将历史记录和实时数据结合起来——您需要在客户端javascript中这样做,而我对Rx js不是很在行


看看关于这个问题的一些讨论,还有-我有一些关于后一种情况的示例代码,这是一个纯粹的.NET场景。

这就是jabbr所做的。这是一个非常常见的问题,我认为是时候发表博客了!数据库+事件存储+信号器+接收FTW!你是提议还是建议李我是否错过了这个问题,或者将
.Replay(200).RefCount()
执行此任务?通常情况下,这并不是那么简单。如果您在一个web场中,或者服务器重新启动等等,该怎么办。
public class MyHub1 : Hub
{        
    public void Subscribe()
    {
        Clients.All.notify("start");
        WebApiApplication.Events
            .Subscribe(s => Clients.Caller.notify(s));
    }
}
myHub.client.notify = function (event) {
     console.info(event);
};