Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 使用反应式扩展,我可以创建一个observable的订阅服务器,直到满足某个条件或出现超时为止_C#_Task Parallel Library_Task_System.reactive - Fatal编程技术网

C# 使用反应式扩展,我可以创建一个observable的订阅服务器,直到满足某个条件或出现超时为止

C# 使用反应式扩展,我可以创建一个observable的订阅服务器,直到满足某个条件或出现超时为止,c#,task-parallel-library,task,system.reactive,C#,Task Parallel Library,Task,System.reactive,我可以/应该为此使用被动扩展吗? 基本上,我有一个ESB,我想监视它的消息(这基本上就是我的hot observable所在的位置),我想创建一组订阅者,只有在满足特定条件和/或发生超时时,它们才会在创建它们的线程中阻塞/暂停 我知道我可以通过Tasks/TaskCompletionSource和取消令牌来实现这一点,但我认为RX似乎非常适合 编辑:超时不在可观察范围内,但应该在订阅者处,在订阅者处,一旦满足超时/条件,他们可以取消订阅并处理自己,这是第一位的 编辑2:订阅服务器和可观察对象可能

我可以/应该为此使用被动扩展吗? 基本上,我有一个ESB,我想监视它的消息(这基本上就是我的hot observable所在的位置),我想创建一组订阅者,只有在满足特定条件和/或发生超时时,它们才会在创建它们的线程中阻塞/暂停

我知道我可以通过Tasks/TaskCompletionSource和取消令牌来实现这一点,但我认为RX似乎非常适合

编辑:超时不在可观察范围内,但应该在订阅者处,在订阅者处,一旦满足超时/条件,他们可以取消订阅并处理自己,这是第一位的

编辑2:订阅服务器和可观察对象可能在不同的线程上处理,但不一定。如果在订阅服务器上使用async/Wait,我希望能够在订阅服务器所在的位置暂停/阻止执行。基本上,一些工作已经完成

我所追求的是利用订户终身管理,这样我就不必做任何事情。IConnectableObservable似乎在这方面提供了一些希望


也许这是方桩、圆孔的地盘

我想这就是你想要的,不完全确定。示例代码总是一个有用的澄清器。诀窍是将运算符不放在源位置,而是放在订阅位置:

async void Main()
{
    var hotObservable = new Subject<string>();

    Func<string, bool> sub1_Condition = s => s != "Disconnect Sub1";
    var subscription1 = hotObservable
        .Timeout(TimeSpan.FromSeconds(5))
        .TakeWhile(sub1_Condition)
        .Subscribe(s => Console.WriteLine($"Sub 1: {s}"), _ => Console.WriteLine("Sub1 Timeout."), () => Console.WriteLine("Sub1 condition met or source ended."));

    Func<string, bool> sub2_Condition = s => s != "Disconnect Sub2";
    var subscription2 = hotObservable
        .Timeout(TimeSpan.FromSeconds(2))
        .TakeWhile(sub2_Condition)
        .Subscribe(s => Console.WriteLine($"Sub 2: {s}"), _ => Console.WriteLine("Sub2 Timeout."), () => Console.WriteLine("Sub2 condition met or source ended."));

    Func<string, bool> sub3_Condition = s => s != "Disconnect Sub3";
    var subscription3 = hotObservable
        .Timeout(TimeSpan.FromSeconds(7))
        .TakeWhile(sub2_Condition)
        .Subscribe(s => Console.WriteLine($"Sub 3: {s}"), _ => Console.WriteLine("Sub3 Timeout."), () => Console.WriteLine("Sub3 condition met or source ended."));

    hotObservable.OnNext("Hello");
    hotObservable.OnNext("Disconnect Sub1");

    await Task.Delay(TimeSpan.FromSeconds(3));

    hotObservable.OnNext("Just Sub 3 should be left");
    hotObservable.OnCompleted();
}

订户阻塞/暂停是什么意思?停止接收通知?订阅者将是可通知的,并且在收到通知后(即通过OnNext)-如果满足特定条件,订阅者将被释放/断开与可观察对象的连接。你知道吗!我想这已经接近我想要的了。我同意代码会有帮助。我将对此进行编码(我正在实现任务,Tcs变体),但对我来说,由于订阅管理,此解决方案更干净。我说得通吗?也许我夸大了好处…我想?Rx往往比任务更干净,但除非你习惯了,否则就不那么直观。在什么情况下,这对您不起作用?不是说它不起作用,我只是简单地使用另一种实现来加速我们团队的工作,将其封装在工厂方法中,然后从tcs返回一个任务,几乎完全满足了我的需要。我唯一的问题是,当调用OnNext时,订阅者中的OnNext回调似乎没有被调用,我认为这可能是由于订阅创建延迟造成的。我想我看到了一种确保订阅创建成为必要条件的方法。我通过使用命令启动程序来控制传入流。也许是点餐吧。
Sub 1: Hello
Sub 2: Hello
Sub 3: Hello
Sub1 condition met or source ended.
Sub 2: Disconnect Sub1
Sub 3: Disconnect Sub1
Sub2 Timeout.
Sub 3: Just Sub 3 should be left
Sub3 condition met or source ended.