【问题标题】:Cannot change a property of WPF from a websocket event无法从 websocket 事件更改 WPF 的属性
【发布时间】:2021-08-12 03:51:44
【问题描述】:

我正在尝试从 websocket 事件更改 WPF 的属性,但是我遇到了一个问题,我得到了这个异常:https://i.imgur.com/lsFt3OR.png

我用谷歌搜索了这个异常,它提出了这篇 Microsoft 文章:https://docs.microsoft.com/en-us/dotnet/api/system.invalidoperationexception?view=netcore-3.1

他们说我可以使用Dispatcher.Invoke 来删除异常(如屏幕截图所示)。我在渲染线程上这样做了,但我仍然收到错误。

enter image description here

其次,我尝试调用将线程分派到主线程的函数,这导致尝试的解决方案出现错误。奇怪的是,我可以根据我所做的打印调试来更改属性。

enter image description here

【问题讨论】:

  • 您能否尝试在操作中移动位图的创建,因为这也可能在访问时遇到问题,如果这没有帮助,请分享 PlayerImage 是什么?这只是名为 PlayerImage 的 xaml 文件中的图像控件吗?
  • 玩家图像是一个图像 uri,应该如下所示:roblox.com/Thumbs/…

标签: c# wpf websocket


【解决方案1】:

我知道这是一个旧线程,但我在搜索中遇到了同样的问题,如果这个问题得到更清楚的回答,其他人可能会觉得它有帮助。也就是说,Andrej Dobes 是正确的,这可能只会提供更多的清晰度。

根据您对上一个答案的回答,您似乎仍然感到困惑。代码需要与上一个屏幕截图的第 49 行类似:

PlayerDataSocket.OnMessage += Application.Current?.Dispatcher?.Invoke(PlayerDataSocket_OnMessage)

? 被添加为非空检查,很可能对于您的情况不是必需的。

【讨论】:

    【解决方案2】:

    您需要使用最初创建对象的线程的调度程序,我猜这将是 UI 线程,因为您正在设置图像。当直接从静态类调用调度器时,你总是得到一个实际分配给实际线程的调度器,这意味着你必须引用拥有该对象的线程的调度器。

    DispatcherPriority.Render 并没有说您想在渲染线程上执行它,但它设置了应该执行的优先级,您可以在msdn 上查看更多信息。

    要访问 UI 线程调度程序,您可以使用下面的代码,但是 UI 线程实际上需要是您正在设置的对象的所有者

    Application.Current.Dispatcher.Invoke(action);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多