Буферизация прогресса для обновлений WPF

#c# #wpf #system.reactive #buffering #tpl-dataflow

#c# #wpf #system.reactive #буферизация #tpl-поток данных

Вопрос:

У меня есть метод, который принимает Progress<T> в качестве параметра и внутренне сообщает о ходе его выполнения.

Поскольку прогресс может происходить быстро (например, сотни раз в секунду) в рабочем потоке, мне нужно буферизировать его, а затем обновлять view-model полученными записями, например, каждые полсекунды.

В прошлом я использовал Observable.FromEventPattern().Buffer(TimeSpan) so, я вижу, что можно использовать тот же механизм Rx, если я оберну Progress<T> отчет в событие. Однако это может показаться излишним. Есть ли более элегантное решение?

Я также просмотрел потоки данных TPL BufferBlock , но я не уверен, поддерживает ли он буферизацию на основе времени, например, каждые полсекунды.

Если у кого-нибудь есть пример, пожалуйста, опубликуйте его. Это будет с благодарностью.

Комментарии:

1. BufferBlock для этого нет никакой поддержки. Вы могли бы использовать BatchBlock и вызывать TriggerBatch() из таймера, но я думаю, что Rx здесь лучший выбор.

2. Спасибо за ваш комментарий. Пошел с Rx.

Ответ №1:

RX — очевидный выбор для этого, однако вам вообще не нужно «использовать» события для использования RX, в вашем случае вы могли бы просто использовать a Subject<Progress<T>> и заставить ваш метод (который в настоящее время получает в Progress<T> качестве параметра) передавать данные в объект. Тогда у вас будет свой запрос RX по этому вопросу, как и ваш предыдущий, для вашего события, полученного из observable

Subject<T> в MSDN

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

Комментарии:

1. Если вы опубликуете свой фактический текущий код, я буду рад отредактировать этот пост, добавив его в качестве образца, переписанного с темой