Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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#_.net_System.reactive - Fatal编程技术网

C# 合并两个IObservable时出现意外行为

C# 合并两个IObservable时出现意外行为,c#,.net,system.reactive,C#,.net,System.reactive,在我最近的“玩Rx”项目中,我有以下情况: 相反,我看到的是 1: 0 2: 1 Merged: 2 Merged: 3 1: 4 2: 5 Merged: 6 Merged: 7 如果我用 while (true) { observer.OnNext(r.Next(0, 1000)); Thread.Sleep(500); } 对于随机的静态或局部实例r,合并序列中包含两个独立序列的其他数字 我不知道如何通过调用observer.OnNext(…)多次执行count++或r

在我最近的“玩Rx”项目中,我有以下情况:

相反,我看到的是

1: 0
2: 1
Merged: 2
Merged: 3
1: 4
2: 5
Merged: 6
Merged: 7
如果我用

while (true)
{
    observer.OnNext(r.Next(0, 1000));
    Thread.Sleep(500);
}
对于随机的静态或局部实例r,合并序列中包含两个独立序列的其他数字

我不知道如何通过调用
observer.OnNext(…)
多次执行
count++
r.Next(0,1000)
。我不明白合并是怎么回事

附言:我曾试图通过锁定或分离两个线程的循环时间来消除竞争条件,但结果没有改变,所以我不考虑这些尝试

Edit:似乎
GenerateSequence
被调用了4次,因此4个线程被旋转到递增
count
。虽然这解释了我所看到的,但我不明白为什么会这样。

  • 订阅
    Observable 1
    时,您订阅了
    Observable.Create(GenerateSequence)
    ,它调用
    GenerateSequence
    ,并启动一个循环
  • 当您订阅
    observate2
    时,您订阅了
    observatable.Create(GenerateSequence)
    ,它调用
    GenerateSequence
    并启动一个循环
  • 当您订阅
    merged
    时,您订阅了
    Observable.Merge(observable1,observable2)
    ,它订阅了
    observable1
    observable2
    。在前两点中,我们看到了当你做每一件事时会发生什么
最终结果是四次调用
GenerateSequence

要使效果非常接近您想要的效果,您需要查看
Publish()


捕获变量的本质不就是在执行函数之前一直引用
count
,然后才计算它的值吗?据我所知,在C#中,整数是按值传递的。即使我将代码更改为
int temp=count++;OnNext观察员(临时)行为不变。C#中的每个变量都通过值传递,甚至是引用类型。尝试执行
inttemp=++count;OnNext观察员(临时)此更改不会改变我观察到的行为。我知道您只是在测试,但查看您的代码,我看到您正在执行
返回一次性。空。那是件坏事。几乎总是有办法归还真正的一次性物品。在您的代码中,我将使用内置的
Observable.Generate(…)
方法。
1: 0
2: 1
Merged: 2
Merged: 3
1: 4
2: 5
Merged: 6
Merged: 7
while (true)
{
    observer.OnNext(r.Next(0, 1000));
    Thread.Sleep(500);
}
var observable1 = Observable
    .Create<int>((Func<IObserver<int>, IDisposable>)GenerateSequence)
    .Publish();
var observable2 = Observable
    .Create<int>((Func<IObserver<int>, IDisposable>)GenerateSequence)
    .Publish();
var merged = observable1.Merge(observable2);

observable1.Subscribe(i => Console.WriteLine("1: " + i.ToString()));
observable2.Subscribe(i => Console.WriteLine("2: " + i.ToString()));
merged.Subscribe(i => Console.WriteLine("Merged: " + i.ToString()));

observable1.Connect();
observable2.Connect();
1: 0
Merged: 0
2: 1
Merged: 1
1: 2
Merged: 2
2: 3
Merged: 3
...