Как внешнее асинхронное завершение операции реализовано в Blazor WebAssembly?

#blazor #threadpool #blazor-client-side #blazor-webassembly

#blazor #threadpool #blazor-на стороне клиента #blazor-webassembly

Вопрос:

Я ищу высокоуровневое описание того, как внешнее асинхронное завершение операции реализовано в Blazor WebAssembly, И меня больше всего интересует, как это работает для таймеров ( Task.Delay и т. Д.) И взаимодействия JS.

Я знаю, что Blazor WASM является однопоточным, поэтому должен быть какой-то цикл событий, или это может быть даже цикл событий JS, который вызывает код WASM, который временно активирует цикл событий WASM / цикл событий пула потоков .NET. Однако возникает вопрос: что происходит один раз .Очередь рабочих элементов СЕТЕВОГО пула потоков становится пустой — т.Е. Больше Нет задач для продолжения прямо сейчас, но ожидается, что они появятся в будущем (из-за таймеров и вызовов JS interop)? Некоторые из вариантов, которые я вижу, следующие:

  • Продолжайте вращение в .NET / WASM и опрашивайте общий буфер, через который JS-to-.NET вызовы сортируются; как только появится новая запись о вызове, преобразуйте ее в рабочий элемент и запускайте, пока можете; после этого промойте и повторите. Недостатком этого подхода является довольно высокое потребление ЦП: в принципе, здесь нет понятия «временная приостановка потока, ожидающего завершения ввода-вывода».
  • Возврат элемента управления обратно в JS-код и остановка выполнения .NET-кода. Этот параметр подразумевает, что такие вещи, как таймеры и ввод-вывод, проходят через JS interop. Здесь нет проблем с высоким потреблением ЦП, но стоимость наличия таймера или ожидания завершения ввода-вывода в этом случае может быть выше.
  • Сочетание этих параметров. Например. Код пула потоков .NET может решить сохранить управление для ожидания таймеров, которые почти готовы к запуску, но передать управление JS, если таких таймеров нет.

В целом, я хотел бы знать, как это работает на самом деле. Высокоуровневого описания более чем достаточно, хотя, если у вас мало времени на его написание, ссылки на исходный код также подойдут.