我使用信号R核心向我发送消息的名单,但这种情况发生
public ObservableCollection<ChatMessage> Messages { get; set; } = new ObservableCollection<ChatMessage>();
public async void InitSignalRAsync()
{
ChatMessage mess = new ChatMessage();
hubConnection = new HubConnectionBuilder().WithUrl("http://localhost:5000/chatHub").Build();
await hubConnection.StartAsync();
hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
mess.user = user;
mess.message = message;
Messages.Add(mess);
});
}
我得到了一个错误
System.Runtime.InteropServices.COMException:
在我
Messages.Add(乱七八糟);
当我收到的数据
发生这种情况,因为Add()
必须在UI线程当您使用ObservableCollection
运行。因此,要使其工作,确保在Dispatcher.RunAsync()
执行调用:
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
Messages.Add(mess);
});
作为Martin noted,你必须更新他们的UI线程视图模型组件。
然而,对于一个解决方案,我建议使用更多通用SynchronizationContext
而非UWP-特定Dispatcher
类。通过使用更普遍的类型,你的代码更具可重用性和更容易测试。
E.g:
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
to async Task
(再次,更好的可重用性和可测试性),并提出了各自的聊天消息,我相信这是预期的行为的新ChatMessage
。