использование Reactive Extensions для мониторинга IEnumerable - PullRequest
0 голосов
/ 01 сентября 2011

Я подключаюсь к объекту, который асинхронно загружает коллекцию объектов в IEnumerable. Когда я подключаюсь, IEnumerable может иметь элементы, уже находящиеся в его коллекции, и может добавлять элементы в течение жизненного цикла приложения, о которых мне нужно уведомлять по мере их появления. Например, это может быть банковский счет, содержащий список банковских операций.

Проблема заключается в следующем. Я хочу совместить обработку начальных значений в IEnumerable с любыми новыми дополнениями. В настоящее время это два процесса. Я хотел бы полностью исключить использование NotifyCollectionChanged.

Я могу изменить бэкэнд, содержащий IEnumerable. Он не должен оставаться в качестве IEnumerable, если решение этого вопроса существует иначе.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Я бы предположил, что объект не должен предоставлять 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, он получает все значения, которые былиопубликованные в теме до настоящего времени, а также новые значения, которые этот субъект генерирует в будущем

0 голосов
/ 30 октября 2011

Вы можете использовать Defer / Replay Operator

...