Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 从阵列在接收中创建热可观测_C#_System.reactive_Reactive Programming - Fatal编程技术网

C# 从阵列在接收中创建热可观测

C# 从阵列在接收中创建热可观测,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我该怎么做 我有一个代码可以: new int[]{1,2,3}.ToObservable().Subscribe(myObserver); 问题是,第一次调用是冷可观察的,因此在另一次调用中,像这样: new int[]{4,5,6}.ToObservable().Subscribe(myObserver); new int[] { 1, 2, 3, } .ToObservable() .Concat(Observable.Never<int>()) .

我该怎么做

我有一个代码可以:

new int[]{1,2,3}.ToObservable().Subscribe(myObserver);
问题是,第一次调用是冷可观察的,因此在另一次调用中,像这样:

new int[]{4,5,6}.ToObservable().Subscribe(myObserver);
new int[] { 1, 2, 3, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver); 

new int[] { 4, 5, 6, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver);

myObserver根本不会触发onNext。显然是因为第一次调用发布了
1,2,3,END
。我不想让可观察对象调用“END”,因为我想以后继续订阅。有没有一个函数可以轻松地为我做到这一点?

在不知道这些观察值在上下文中如何使用的情况下,我的第一个建议是在订阅之前将两个观察值(或
IEnumerable
s)浓缩

(new int[]{1,2,3}.ToObservable())
.Concat(new int[]{4,5,6}.ToObservable())
.Subscribe(myObserver)

据我所知,没有一种方法可以在代码中的
ToObservable
Subscribe
调用之间插入,以获得所需的行为。可以编写这样的方法,但它不能很好地与库的其余部分配合使用。

您需要执行以下操作:

new int[]{4,5,6}.ToObservable().Subscribe(myObserver);
new int[] { 1, 2, 3, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver); 

new int[] { 4, 5, 6, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver);
newint[]{1,2,3,}
.TooObservable()文件
.Concat(可观察到的.Never())
.订阅(myObserver);
新int[]{4,5,6,}
.TooObservable()文件
.Concat(可观察到的.Never())
.订阅(myObserver);

关键是对Observable执行
.Concat(observatable.Never())
,以防止它永远结束。

Fwiw,要将冷的Observable变为热的Observable,请使用多播:

var obs = new[] {1,2,3}.ToObservable()
    .Multicast(new Subject<int>())

// TODO: Subscribe as many people as you want

obs.Connect();  // Everyone subscribed gets 1,2,3,Completed now

obs.Subscribe(...);  // This guy gets no results
var obs=new[]{1,2,3}.ToObservable()
.Multicast(新主题())
//TODO:订阅任意数量的用户
obs.Connect();//每个人都订阅了1,2,3,现在完成
obs.Subscribe(…);//这家伙没有结果

哦,顺便说一句,你所要求的不是一个“热”的可观察到的。你的问题标题有点误导人。顺便说一句,BTQ是对BTW的拼写错误。;-)非常感谢。“那应该可以了。”阿尔温-不用担心。只是一个快速警告-您需要确保正确处理所有异常,因为它们也将结束任何可观察到的异常。如果你需要过滤掉异常(这通常是一个坏主意),那么看看
.Materialize()
&
.Dematerialize()
。如果用户实际获取数组,然后将其转换为可观察序列,可能不必担心错误:)Gideon,这不是我正在研究的选项。我不能同时使用这两个列表,事实上它们在代码的两个独立区域中,我不想将它们结合在一起。