Я бы предположил, что объект не должен предоставлять IEnumerable, так как он предназначен для «холодных наблюдаемых значений», где в вашем случае вам нужно что-то, что может получить дополнительные элементы в будущем.
Лучший способ смоделировать это - использовать ReplaySubject<T>
вместо IEnumerable.Ниже приведен пример, который демонстрирует ситуацию, аналогичную вашей:
//Function to generate the subject with future values
public static ReplaySubject<int> GetSubject()
{
var r = new ReplaySubject<int>();
r.OnNext(1); r.OnNext(2); r.OnNext(3);
//Task to generate future values
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(3000);
r.OnNext(DateTime.Now.Second);
}
});
return r;
}
Код потребления:
var sub = GetSubject();
sub.Subscribe(Console.WriteLine);
Каждый раз, когда кто-либо подписывается на sub
, он получает все значения, которые былиопубликованные в теме до настоящего времени, а также новые значения, которые этот субъект генерирует в будущем