我正试图从websocket事件更改WPF的属性,但遇到了一个问题,我得到了这个异常:https://i.stack.imgur.com/k6vj1.png
我在谷歌上搜索了这个例外,它显示了这篇微软的文章:https://learn.microsoft.com/en-us/dotnet/api/system.invalidoperationexception?view=netcore-3.1
他们说我可以使用Dispatcher.Invoke
来删除异常(如屏幕截图所示(。我在一个渲染线程上这样做了,但我仍然得到了错误。
在此处输入图像描述
其次,我试图调用函数将线程调度到主线程上,这导致了尝试的解决方案中的错误。奇怪的是,我有权根据我所做的打印调试来更改属性。
在此处输入图像描述
我知道这是一个旧线程,但我在搜索中遇到了同样的问题,如果答案更清楚,其他人可能会觉得这很有帮助。也就是说Andrej Dobes是正确的,这可能只是提供了更多的清晰度。
根据你对上一个答案的回答,你看起来仍然很困惑。代码需要看起来与您之前屏幕截图的第49行类似:
PlayerDataSocket.OnMessage += Application.Current?.Dispatcher?.Invoke(PlayerDataSocket_OnMessage)
?
被添加为非空检查,很可能对您的情况没有必要。
您需要使用最初创建对象的线程的调度器,我想这将是UI线程,因为您正在设置图像。当直接从静态类调用dispatcher时,您总是会得到实际分配给实际线程的调度器,这意味着您必须具有对拥有该对象的线程的调度器的引用。
调度优先级。Render并没有说你想在渲染线程上执行它,但它设置了应该执行它的优先级,你可以在msdn上查看更多信息。
要访问UI线程分配器,您可以使用下面的代码,但UI线程实际上需要是您正在设置的对象的所有者
Application.Current.Dispatcher.Invoke(action);