Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 661новая вакансия за сутки·92 296вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 192
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 143
  • Облачные технологии14 064
  • QA вакансии3 446
  • Backend вакансии2 095
  • Инженер данных1 792
  • Продакт-менеджер1 233

Разработка

  • Android1 857
  • iOS1 697
  • Fullstack вакансии981
  • AI вакансии949
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 689
  • Java6 529
  • Node.js2 023
  • .NET1 723
  • Kotlin1 596
  • Rust1 462
  • C#710
  • PHP683
  • C++574

DevOps и инфраструктура

  • Kubernetes7 762
  • DevOps вакансии6 052
  • Linux-инфраструктура5 491
  • Terraform / IaC4 268
  • CI/CD3 244
  • Мониторинг и Observability1 789
  • SRE567
  • Кибербезопасность455

Аналитика и данные

  • Data Scientist1 124
  • Бизнес-аналитик917
  • Аналитик данных839
  • Системный аналитик151

Другие направления

  • Проджект-менеджер606
  • UI/UX дизайн142
  • Ручное тестирование14

По регионам

  • Вакансии в США43 473
  • Вакансии в Европе23 552
  • Вакансии в Канаде4 444
  • Работа в России3 901

По формату

  • Удалённые вакансии73 579
  • Релокация в США43 516
  • Гибридная работа12 395
  • Офисная работа7 085

По уровню

  • Senior вакансии42 222
  • Middle вакансии20 589
  • Junior вакансии6 639

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме BlazorВсе вопросы
BlazorSeniorТеория

В чём разница между InvokeAsync(StateHasChanged) и StateHasChanged()?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

StateHasChanged() должна вызываться из UI-потока; InvokeAsync(StateHasChanged) маршалирует вызов в контекст синхронизации компонента и безопасен из фоновых потоков и таймеров.

InvokeAsync — безопасный маршалинг

InvokeAsync — метод базового класса ComponentBase, унаследованный от IHandleEvent. Он выполняет делегат в контексте синхронизации компонента, аналогично Dispatcher.InvokeAsync в WPF или Control.Invoke в WinForms.

// ПРАВИЛЬНО: вызов из фонового потока
private Timer? _timer;

protected override void OnInitialized()
{
    _timer = new Timer(async _ =>
    {
        _counter++;
        await InvokeAsync(StateHasChanged); // безопасно из ThreadPool
    }, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}

public async ValueTask DisposeAsync()
{
    if (_timer is not null)
        await _timer.DisposeAsync();
}
// НЕПРАВИЛЬНО: прямой вызов из другого потока в Blazor Server
private void OnExternalEvent(object? sender, EventArgs e)
{
    _data = "updated";
    StateHasChanged(); // может выбросить InvalidOperationException
}

StateHasChanged vs InvokeAsync(StateHasChanged)

Как работает StateHasChanged

Метод StateHasChanged() уведомляет Blazor о том, что состояние компонента изменилось и необходим повторный рендеринг. В Blazor Server он выполняется в контексте синхронизации, связанном с SignalR-соединением конкретного пользователя. В Blazor WebAssembly — в основном потоке браузера.

Если StateHasChanged() вызывается из другого потока (таймер, фоновая задача, обработчик события из внешнего сервиса), это нарушает потокобезопасность и в Blazor Server приводит к исключению или повреждённому состоянию рендеринга.

Когда StateHasChanged() безопасна без InvokeAsync

  • Внутри обработчиков событий компонента (@onclick, @oninput) — Blazor уже находится в правильном контексте.
  • Внутри OnInitializedAsync, OnParametersSetAsync — вызываются из корректного контекста.
  • После await внутри жизненного цикла компонента — SynchronizationContext сохраняется.

Паттерн с внешними сервисами

@implements IDisposable
@inject INotificationHub Hub

@code {
    private string _lastMessage = "";

    protected override void OnInitialized()
    {
        Hub.OnMessage += HandleMessage;
    }

    private async void HandleMessage(string message)
    {
        _lastMessage = message;
        await InvokeAsync(StateHasChanged);
    }

    public void Dispose()
    {
        Hub.OnMessage -= HandleMessage;
    }
}

Обратите внимание: async void допустим только для обработчиков событий — исключения из него не перехватываются вызывающей стороной.

InvokeAsync с произвольным действием

// Выполнить любой код + обновить UI атомарно
await InvokeAsync(() =>
{
    _items = newItems;
    StateHasChanged();
});

Подводные камни

  • В Blazor WebAssembly всё работает в одном потоке, поэтому проблемы потокобезопасности не возникают — но код с InvokeAsync остаётся переносимым и корректен для Blazor Server.
  • StateHasChanged() внутри OnAfterRenderAsync вызывает ещё один цикл рендеринга — легко создать бесконечный цикл, если не добавить флаг firstRender.
  • Частый вызов InvokeAsync(StateHasChanged) из таймера с маленьким интервалом нагружает SignalR-канал — добавляйте дебаунс или ограничение частоты.
  • После Dispose компонента вызов InvokeAsync выбрасывает ObjectDisposedException — проверяйте флаг _disposed перед вызовом.
  • При наследовании от ComponentBase метод InvokeAsync доступен напрямую; при наследовании от OwningComponentBase или кастомных классов убедитесь, что он также доступен.

Типичные ошибки

  • Путать InvokeAsync(StateHasChanged) и поток UI-синхронизации с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Blazor: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет InvokeAsync(StateHasChanged) и поток UI-синхронизации на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме Blazor →

Источники

  • https://learn.microsoft.com/en-us/aspnet/core/blazor/components/rendering
←Предыдущий вопросКак реализовать SignalR в приложении Blazor?Следующий вопрос→Расскажите о случае, когда вы улучшали performance, accessibility, testing или maintainability в проекте на Blazor.

Связанные темы

Blazorruntime-reasoning

Частые вопросы на собеседовании

  • В чём разница между Blazor Server и Blazor WebAssembly?
  • Что такое Blazor и каковы его основные модели хостинга?
  • Как Blazor управляет повторным рендерингом компонентов и как его оптимизировать?
  • В каких типах frontend-проектов Blazor даёт реальный выигрыш, а где будет избыточен или неудачен?