C# 中的 FIFO 与 winform
我对线程中的 GUI 问题感到恼火。 如何创建 FIFO,以便我的主窗体/线程将接收数据来执行操作,而不是让我的线程使用回调并自行运行代码(并失败)?
有问题的 gui 问题 -> SelectedNode = .Nodes[0] 上的线程异常
I'm getting annoyed with GUI problems in my threads. How do i create a FIFO so my main form/thread will receive data to do things instead of having my threads use a callback and run the code (and fail) themselves?
The gui problem in question -> Thread exception on SelectedNode = .Nodes[0]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用 SynchronizationContext 将“调用”
Post
/Send
发送到 UI线。Use SynchronizationContext to
Post
/Send
"calls" to the UI thread.在Winform控件上的BeginInvoke,要进行跨线程调用,将使用Window的消息队列,即FIFO。
BeginInvoke on a Winform control, to make a call across threads, will use the Window's message queue, which is FIFO.
如果您有主窗体(或任何控件)的句柄,则可以使用
Control.Invoke
/Control.BeginInvoke
。如果您不想分发
Control
实例,您可以为外部代码提供一个ISynchronizeInvoke
实例(任何控件都可以做到这一点,或者编写您自己的类包裹一个Control
以防止调用者强制转换)。 然后调用者可以使用它来执行方法。最后,考虑使用事件; 运行的代码会引发 UI 处理的事件; 然后,UI 可以在本地调用
Control.Invoke
来处理数据。If you have a handle to the main form (or any control), you can use
Control.Invoke
/Control.BeginInvoke
.If you don't want to hand out a
Control
instance, you can give external code anISynchronizeInvoke
instance (any control will do it, or write your own class that wraps aControl
to prevent caller-casting). Then the caller can use this to perform methods.Finally, consider using events; the running code raises events that your UI handles; the UI can then call
Control.Invoke
locally to process the data.