Используя проект по умолчанию, который загружается вместе с Visual Studio 2019 при создании нового проекта на стороне сервера Blazor в .NetCore 3.1, рассмотрите следующий пример (небольшое изменение на собственной странице примера счетчика):
<button class="btn btn-primary" @onclick="SingleMethodUpdate">Click Me</button>
<label>Update from same method: @result</label>
<button class="btn btn-primary" @onclick="NestedMethodUpdate">Click Me</button>
<label>Update from nested method: @nestedResult</label>
И выделенный код выглядит следующим образом:
int result = 0;
int nestedResult = 0;
int nestedCounter = 0;
protected async Task SingleMethodUpdate()
{
result++;
}
protected async Task NestedMethodUpdate()
{
await NestedUpdate(++nestedCounter);
await Task.Delay(1000);
await NestedUpdate(++nestedCounter);
await Task.Delay(1000);
await NestedUpdate(++nestedCounter);
}
protected Task NestedUpdate(int update)
{
nestedResult = update;
return Task.FromResult(0);
}
Первая кнопка и метка просты, нажмите кнопку, и счетчик обновится в интерфейсе, как только вы нажмете его, как и ожидалось. Однако вторая кнопка более сложна.
Это средний await NestedUpdate(++nestedCounter)
вызов, который не отражается в интерфейсе пользователя. Первый и последний вызовы (первый и последний вызов вложенного метода) отражаются в режиме реального времени в пользовательском интерфейсе, поэтому вы видите:
Update from nested method: 1
*2 seconds go by
Update from nested method: 3
Я понимаю, что это из-за предостережений с SynchronizationContext
, но мне более любопытно, как бы я go о захвате и поддержании этого контекста, чтобы каждый метод awaited
, который вызывается в моем событии нажатия кнопки, использовал тот же контекст, чтобы Пользовательский интерфейс будет обновляться в режиме реального времени по мере выполнения кода. Есть ли хороший / красивый способ сделать это?