ネイティブ.NETイベントから作成されたIObservableからIEnumerableを取得しようとすると、最初の要素を照会するときにIEnumerableがブロックされます。私は間違って何をしていますか?Observable.FromEvent(...)を取得できません。ToEnumerable()が動作する
私は小さな完全な例を作りました。最初のテストメソッドはブロックされますが、イベントは別のIObservableによって正しくプッシュされます。 2番目のテスト方法はプレーンな配列で動作し、ブロックされません。
ありがとうございます!
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestGTI.Reactive
{
class ItHappenedEventArgs : EventArgs
{
}
class A
{
public event EventHandler<ItHappenedEventArgs> ItHappened;
public void RaiseItHappened(ItHappenedEventArgs e)
{
if (ItHappened != null)
{
ItHappened(this, e);
}
}
}
[TestClass]
public class ReactiveTest
{
[TestMethod]
public void EnumerateEventTest()
{
var a = new A();
ItHappenedEventArgs pushed = null;
Observable.FromEvent<ItHappenedEventArgs>(a, "ItHappened").Subscribe(e =>
{
pushed = e.EventArgs;
});
var itHappenedEnum = Observable.FromEvent<ItHappenedEventArgs>(a, "ItHappened").ToEnumerable();
var itHappenedEventArgs = new ItHappenedEventArgs();
a.RaiseItHappened(itHappenedEventArgs);
Assert.AreSame(itHappenedEventArgs, pushed);
// blocks!!!
Assert.AreSame(itHappenedEventArgs, itHappenedEnum.First());
}
[TestMethod]
public void ObservableToEnumerableTest()
{
var array = new int[] { 1, 2, 3 };
var enumerable = array.ToObservable().ToEnumerable();
// works
Assert.AreEqual(1, enumerable.First());
}
}
}
あなたが正しいです、GetEnumerator()が呼び出されるとサブスクリプションが発生します。 Replay()は私が探していたものです。ありがとう! – Ernesto
あなたは大歓迎です:) –