Эквивалент ObserveOnDispatcher в Blazor

#c# #multithreading #blazor #system.reactive #blazor-server-side

#c# #многопоточность #blazor #system.reactive #blazor-на стороне сервера

Вопрос:

В Blazor нет единого потока пользовательского интерфейса и, насколько я знаю, нет диспетчера. ComponentBase.InvokeAsync(..) Однако существует:

 protected Task InvokeAsync(Action workItem);
protected Task InvokeAsync(Func<Task> workItem);
  

Как мне переключиться с потока, отличного от пользовательского интерфейса, на поток пользовательского интерфейса?

 IObservable<int> source ...
source.Throttle(100) // will continue on non UI thread
  .ObserveOnComponent() // how do I write this?
  .ObserveOn(this.InvokeAsync) // or this?
  .Do(this.StateHasChanged); // something that requires UI thread
  .Subscribe();
  

Комментарии:

1. Сервер Blazor или Blazor Wasm?

2. По крайней мере, в серверной версии есть как диспетчер, так и контекст синхронизации.

3. Это сервер blazor. Хорошо, но как мне получить к нему доступ?

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