无法添加项目的ObservableCollection

问题描述 投票:0回答:2

我使用信号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(乱七八糟);

当我收到的数据

c# uwp signalr
2个回答
1
投票

发生这种情况,因为Add()必须在UI线程当您使用ObservableCollection运行。因此,要使其工作,确保在Dispatcher.RunAsync()执行调用:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { 
    Messages.Add(mess);
 });

3
投票

作为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

© www.soinside.com 2019 - 2024. All rights reserved.