Когда я пытаюсь получить IEnumerable из IObservable, который был создан из собственного события .NET, IEnumerable блокируется при запросе первого элемента. Что я делаю не так?
Я построил небольшой законченный пример. Первый метод теста блокируется, хотя событие правильно отправляется другим IObservable. Второй метод тестирования работает с простым массивом и не блокирует.
Спасибо!
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());
}
}
}