Да, таймер - это хороший способ.
У меня есть нечто похожее для компонента Blazor, называемого Sprite, где я выполняю перемещение изображения каждый раз, когда происходит событие таймера.
В моем случае мой подписчик - это интерфейс ISpriteSubscriber:
namespace DataJuggler.Blazor.Components.Interfaces
{
#region interface ISpriteSubscriber
/// <summary>
/// This interface is used by the AnimationManager to notifiy callers that a refresh occurred.
/// </summary>
public interface ISpriteSubscriber
{
#region Methods
#region Refresh()
/// <summary>
/// This method will call StateHasChanged to refresh the UI
/// </summary>
void Refresh();
#endregion
#region Register(Sprite sprite)
/// <summary>
/// This method is called by the Sprite to a subscriber so it can register with the subscriber, and
/// receiver events after that.
/// </summary>
void Register(Sprite sprite);
#endregion
#endregion
#region Properties
#region ProgressBar
/// <summary>
/// This is used so the ProgressBar is stored and available to the Subscriber after Registering
/// </summary>
ProgressBar ProgressBar { get; set; }
#endregion
#endregion
}
#endregion
}
public ISpriteSubscriber Subscriber { get; set; }
В моем событии Start я создаю Таймер:
public void Start()
{
this.Timer = new Timer();
this.Timer.Interval = this.interval;
this.Timer.Elapsed += Timer_Elapsed;
this.Timer.Start();
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
// if a subscriber (returns true if Subscriber != null)
if (HasSubscriber)
{
// Notify Subscriber
Subscriber.Refresh();
}
}
public void Refresh()
{
// do your actions here
}
public void Register(Sprite sprite)
{
// If the sprite object exists
if (NullHelper.Exists(sprite))
{
// if this is the RedCar
if (sprite.Name == "RedCar")
{
// Set the RedCar
RedCar = sprite;
}
else
{
// Set the WhiteCar
WhiteCar = sprite;
}
}
}
Событие Refre sh - это то, куда я перемещаю изображение (случайными числами в моем примере).
Один совет При использовании таймера, который срабатывает так часто, как у вас, я обычно ставлю что-то вроде флага NotificationInProgress или что-то в случае, если одна операция занимает больше секунды.
Возможно в вашем В случае использования можно иметь несколько сообщений, но иногда вам нужно подождать, пока одно из них не закончится sh, прежде чем завершить следующее.
public bool NotificationInProgress { get; set; }
Затем, прежде чем уведомить подписчика, я проверяю
if (!NotificationInProgress)
{
// send your message.
}
Если вы хотите увидеть пример проекта Blazor с открытым исходным кодом, где я демонстрирую простые анимации, из которых получен этот код, он находится здесь:
https://github.com/DataJuggler/DataJuggler.Blazor.Components
Возможно, это даст вам некоторые идеи о том, как организовать ваш проект.