サブスクリプションが相互に作用するのはなぜですか?
-
22-09-2019 - |
質問
私は RX を実験していますが、次の問題に遭遇しました (少なくとも私はそれを問題として認識しています)。次のコードは、observable を作成し、それを 2 回サブスクライブします。私は思った サブスクリプションは独立して動作する必要があります, したがって、以下のコードは、キーを押すたびに、サブスクリプションごとに 1 行ずつ、計 2 行を出力します。しかし、これは当てはまりません。特定のキー ストロークを処理するためのサブスクリプションは常に 1 つだけで、最初か 2 番目に半ランダムに取得されます。なぜこれが起こっているのでしょうか?また、複数のオブザーバーを実行するための「推奨される」方法は何ですか?
static IEnumerable<ConsoleKeyInfo> KeyPresses()
{
for (; ; )
{
var currentKey = Console.ReadKey(true);
if (currentKey.Key == ConsoleKey.Enter)
yield break;
yield return currentKey;
}
}
static void Main()
{
var timeToStop = new ManualResetEvent(false);
var keypresses = KeyPresses().ToObservable();
keypresses.Subscribe(key => Console.WriteLine(key.Key + "1"),
() => timeToStop.Set());
keypresses.Subscribe(key => Console.WriteLine(key.Key + "2"),
() => timeToStop.Set());
timeToStop.WaitOne();
}
解決
この特定の動作の理由は、オブザーバブルが 寒い. 。これは、各サブスクライバが .GetNext() の ReadKey 呼び出しを消費していたことを意味します。呼び出してオブザーバブルを「ウォームアップ」するとすぐに
var keypresses = KeyPresses().ToObservable().Publish();
各加入者は独自の値を受け取りました。
所属していません StackOverflow