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

+1 128новых вакансий за сутки·93 813вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

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

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 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 даёт реальный выигрыш, а где будет избыточен или неудачен?