Как исправить «текущий поток не связан с контекстом синхронизации рендерера»? - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь изменить изменить строку, используемую для заголовка, в моем приложении Blazor на стороне сервера. Но у меня возникают проблемы с обновлением пользовательского интерфейса.

Я пытался использовать StateHasChanged (), но это не сработало, поэтому я осмотрелся и обнаружил, что на демонстрации FlightFinder , которая была сделана, она имеет событие OnChange Action, поэтому я пытаюсь реализовать что.

Работает до тех пор, пока я не попытаюсь обновить браузер, а затем появляется эта ошибка

System.InvalidOperationException: 'Текущий поток не связан с контекстом синхронизации средства визуализации. Используйте Invoke () или InvokeAsync (), чтобы переключить выполнение в контекст синхронизации рендерера при запуске рендеринга или изменении любого состояния, доступного во время рендеринга. '

Вот что у меня есть:

private string _title = "TestSite";
public string Title => _title;

public event Action OnChange;

public void ChangePage(string pageName)
{
   _title = pageName;
   NotifyStateChanged();
}

private void NotifyStateChanged(int navigationType = 0)
{
   OnChange?.Invoke();
}

Все, что мне нужно сделать, это вызвать ChangePage («заголовок страницы»), и это работает, если, как я уже говорил, я не пытаюсь обновить.

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

Итак, что я могу сделать, чтобы убедиться, что метод m invoke находится в правильном потоке? Или есть другой способ изменить заголовок, который был бы более эффективным?

Заранее спасибо!

1 Ответ

3 голосов
/ 06 июня 2019

Утром я опубликовал эту первую мысль, думая, что у меня не будет времени на то, чтобы разобраться, и подумав, что к тому времени, когда кто-нибудь сможет мне помочь, я найду время, чтобы разобраться в этом подробнее. Хотя я уже потратил пару дней, обдумывая это.

Наконец-то я нашел эту статью , в которой объясняется, что то, что я пытаюсь сделать, называется контейнером состояний.

То, что они сказали, - это то, что я мог вводить класс как одиночку, чем я и занимался, или службой с определенной областью. Оказывается, все, что мне нужно было сделать, это изменить его на сервис с ограниченным доступом, и он прекрасно работает!

...