Почему Buffer из моего Observable не получает события?

Я пробовал несколько способов, но не смог вызвать метод подписки:

  • Способ 1:

    var buffer = new List<Kpi>();
    buffer.ToObservable().Buffer(TimeSpan.FromMinutes(1), 5).Subscribe(
    async kpis =>
    {
        await _retry.ExecuteAsync(() => Process(kpis.ToList())).ConfigureAwait(false);
    });
    

    Тогда buffer.Add(new Kpi()); не будет запускать мой метод.


  • Метод 2: (Примечание: я прочитал определение специальных методов Empty/Never/Throw, но, кроме них, я не могу найти способ создать наблюдаемую, которая выдает что-то отличное от примитивных чисел и т. д.)

    var buffer = Observable.Empty<Kpi>();
    buffer.Buffer(TimeSpan.FromMinutes(1), 5).Subscribe(
    async kpis =>
    {
        await _retry.ExecuteAsync(() => Process(kpis.ToList())).ConfigureAwait(false);
    });
    

    Затем buffer.Publish(new Kpi()) . Опять ничего не происходит

В чем я ошибаюсь?


person Cemre Mengü    schedule 04.01.2017    source источник
comment
Можете ли вы добавить определение буфера к каждому фрагменту? Непонятно, какой буфер во втором.   -  person Euphoric    schedule 04.01.2017
comment
@Euphoric Спасибо, отредактировано.   -  person Cemre Mengü    schedule 04.01.2017


Ответы (1)


В первом случае вызов ToObservable на List не заставит List волшебным образом уведомить об изменениях. List просто не имеет такой возможности.

Во втором случае Publish что-то совершенно другое, чем то, что вы ожидаете.

Если вы хотите создать наблюдаемое из событий, вы ищете Subject.

var buffer = new Subject<Kpi>();
buffer.Buffer(TimeSpan.FromMinutes(1), 5).Subscribe(
async kpis =>
{
    await _retry.ExecuteAsync(() => Process(kpis.ToList())).ConfigureAwait(false);
});

// notify of new item
buffer.OnNext(new Kpi());

Существует много способов создать новую наблюдаемую последовательность< /а>. Я бы порекомендовал прочитать его, чтобы понять, подходит ли он вам больше. Например, превращение события в наблюдаемое.

person Euphoric    schedule 04.01.2017
comment
Спасибо OnNext и Subject было то, что мне было нужно! Тем не менее, я читал о том, как избегать Subject. Будут ли у него недостатки? - person Cemre Mengü; 04.01.2017
comment
@Cemre Субъект является низкоуровневым примитивом. Таким образом, вы должны быть осторожны в его использовании. Вы всегда должны думать, есть ли другой способ, прежде чем использовать Subject, поскольку есть допустимый случай для использования Subject. - person Euphoric; 04.01.2017
comment
мой 2¢: Если вы хотите создать наблюдаемое из событий, вам не нужен класс Subject, а Observable.FromEventPattern. - person supertopi; 04.01.2017
comment
Таким образом, это оставляет вопрос; Что вызывает buffer.OnNext(new Kpi());? Ответ на этот вопрос приведет вас к замене использования Subject<T>. - person Lee Campbell; 04.01.2017
comment
@LeeCampbell - Это очень хороший способ подумать о том, как удалить тему. Мне это нравится. - person Enigmativity; 06.01.2017