#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
Однако, если вам удобнее делать это с событием так, как вы привыкли, я не вижу в этом ничего лишнего.
Комментарии:
1. Если вы опубликуете свой фактический текущий код, я буду рад отредактировать этот пост, добавив его в качестве образца, переписанного с темой