Вот другой подход, если вы не хотите go с SignalR или WebSockets.
У меня есть таймер, который отправляет интервал как часть моего компонента Sprite, чтобы дать вам пример как это сделать:
У Sprite есть свойство с именем Subscriber
[Parameter]
public ISpriteSubscriber { get; set; }
Хост-компонент или страница является интерфейсом 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
}
Чем в вашей бритве код для установки родителя, вы устанавливаете Subscriber = this:
Обратите внимание на интервал = 50. Это устанавливает таймер на повторение sh каждые 50 миллисекунд.
В установщике для моего компонента Sprite, первое, что я делаю, это вызываю Register с родителем:
[Parameter]
public ISpriteSubscriber Subscriber
{
get { return subscriber; }
set
{
// set the value
subscriber = value;
// if the value for HasSubscriber is true
if (HasSubscriber)
{
// Register with the Subscriber so they can talk to each other
Subscriber.Register(this);
}
}
}
Этот код здесь на странице указателя, на которой размещен спрайт, и регистрируется спрайт с родителем:
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;
}
}
}
Теперь, когда нажата моя кнопка стартовой гонки, я запускаю только 1 таймер, мне не нужны два таймера работает даже при том, что у меня две машины:
public void StartRace()
{
// if both cars exist
if (NullHelper.Exists(RedCar, WhiteCar))
{
// Create a new instance of a 'RandomShuffler' object.
Shuffler = new RandomShuffler(2, 12, 100, 3);
// Start the timer on the RedCar
RedCar.Start();
}
}
Вот метод запуска Sprite:
public void Start()
{
this.Timer = new Timer();
this.Timer.Interval = this.interval;
this.Timer.Elapsed += Timer_Elapsed;
this.Timer.Start();
}
А затем событие Timer_Elapsed вызывает Абонента для обновления sh:
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
// if a subscriber exists
if (HasSubscriber)
{
// Notify Subscriber
Subscriber.Refresh();
}
}
Теперь в этом случае мой метод refre sh вызывается каждые 50 миллисекунд, и я обновляю свой пользовательский интерфейс:
public void Refresh()
{
// do your updates
// Update the UI
InvokeAsync(() =>
{
StateHasChanged();
});
}
Если вы хотите увидеть полный рабочий пример, клонируйте этот проект и посмотрите в папке примеров ProgressBarSample.
https://github.com/DataJuggler/DataJuggler.Blazor.Components
Здесь также есть видео, если вы хотите посмотреть: https://youtu.be/frtetHgfdIo
Я использовал этот подход родитель / ребенок для Fe w вещи, и это работало так хорошо, что я написал в блоге об этом: Использование интерфейсов для связи между компонентами Blazor
Я считаю, что это хороший способ поговорить с другими компонентами или отправить данные.