Рассмотрим пример приложения Blazor Server, реализующего обычные часы. Для этого создадим небольшой компонент Blazor и используем его на главной странице приложения.
Компонент Clock
Создадим новое приложение Blazor Server и добавим в папку Shared новый компонент Clock:

Наши часы должны отсчитывать время с интервалом в 1 секунду и отображать текущее время пользователю. Для выполнения этой задачи нам пригодиться компонент Timer из пространства имен System.Threading. Напишем следующий код компонента Clock:
@code {
System.Threading.Timer? timer;
DateTime time = DateTime.Now;
private async void SetClock(object stateInfo)
{
time = DateTime.Now;
await InvokeAsync(StateHasChanged);
}
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
timer = new System.Threading.Timer(SetClock, new System.Threading.AutoResetEvent(false), 1000, 1000);
}
}
Учитывая знания о жизненном цикле компонентов Blazor, мы перегрузили в своем компоненте метод компонента OnInitializedAsync. В этом методе мы создали объект таймера (timer), передав ему в качестве метода обратного вызова метод SetClock. В методе SetClock мы присваиваем переменной time текущее значение даты/времени и сообщаем Blazor о том, что состояние компонента было изменено и необходимо перерисовать компонент (вызываем асинхронно метод StateHasChanged).
Теперь допишем компонент, дописав необходимую часть разметки пользовательского интерфейса:
@page "/clock"
<h3>Часы</h3>
@if (timer != null)
{
<p>Дата: @time.ToString("D")</p>
<p>Время: @time.ToString("T")</p>
}
Весь исходный код компонента Clock представлен ниже:
@page "/clock"
<h3>Часы</h3>
@if (timer != null)
{
<p>Дата: @time.ToString("D")</p>
<p>Время: @time.ToString("T")</p>
}
@code {
System.Threading.Timer? timer;
DateTime time = DateTime.Now;
private async void SetClock(object stateInfo)
{
time = DateTime.Now;
await InvokeAsync(StateHasChanged);
}
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
timer = new System.Threading.Timer(SetClock, new System.Threading.AutoResetEvent(false), 1000, 1000);
}
}
Добавление компонента на главную страницу приложения
Откроем код компонента Pages/Index.razor и добавим наш компонент Clock сразу после заголовка:
@page "/" <PageTitle>Index</PageTitle> <h1>Hello, world!</h1> <Clock/> Welcome to your new app. <SurveyPrompt Title="How is Blazor working for you?" />
Теперь можем запустить приложение и убедиться, что часы отсчитывают время с интервалом в 1 секунду:
Итого
Для разработки приложения «Часы» нам потребовалось немного, а именно — знания о жизненном цикле компонентов Blazor, основы работы с разметкой Razor и о том, как использовать класс System.Threading.Timer.
