Как заметил Мартин , вы должны обновить компоненты ViewModel из их потока пользовательского интерфейса.
Однако для решения я рекомендую использовать более универсальный SynchronizationContext
, а не UWP-специфический Dispatcher
класс.Используя более общий тип, ваш код более пригоден для повторного использования и более тестируем.
Например:
public ObservableCollection<ChatMessage> Messages { get; set; } = new ObservableCollection<ChatMessage>();
public async Task InitSignalRAsync()
{
var context = SynchronizationContext.Current;
hubConnection = new HubConnectionBuilder().WithUrl("http://localhost:5000/chatHub").Build();
await hubConnection.StartAsync();
hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
var mess = new ChatMessage
{
user = user,
message = message,
};
context.Post(_ => Messages.Add(mess));
});
}
Я также изменил ваш async void
на async Task
(опять же, улучшенное повторное использование и тестируемость), и сделал новый ChatMessage
для каждого сообщения чата, которое, я считаю, является предполагаемым поведением.