gpt4 book ai didi

c# - 从不同线程传递数据时,是否有其他方法可以在 WPF 中调用?

转载 作者:行者123 更新时间:2023-11-30 22:30:05 25 4
gpt4 key购买 nike

我知道如何通过 Invoke/BeginInvoke 将数据从工作线程传递到主线程。我还可以从主线程中使用定时器从线程安全集合中提取数据。我更喜欢使用任务 (Task.Factory.StartNewTask()) 并将 Backgroundworker 与它们一起使用,接缝有点笨拙。

有时 gui 有点滞后,我认为这是由于 (Begin)Invoke。用计时器拉动也不是正确的方法。为每个新任务接缝创建一个新的 Backgroundworker 也很奇怪。

还有其他可能吗?

最佳答案

在 .NET 中,内存在 AppDomain 内共享,这意味着所有线程都可以访问所有数据。因此,您实际上在做的是控制对来自特定线程的特定数据位的访问,这样它们就不会相互干扰。

Invoke 和 BeginInvoke 允许您在 UI 线程上运行代码,这很有用,因为 UI 控件只能从 UI 线程访问。 BackgroundWorker 和 SynchronizationContext 是另一种解决方案。

但是,它们都是通过将已知的窗口消息发送到 UI 消息循环来工作的。如果您过于频繁地调用 Invoke,则会发送过多的消息,并且 UI 线程会被淹没,这会使 UI“有点滞后”。

如果发生这种情况,您必须降低消息的发送速度。有几种方法可以做到这一点:

1) 降低调用 Invoke 的频率:这意味着在调用 Invoke 更新 UI 之前,等待后台线程中更大“ block ”的状态更改。

2) 使用 UI 计时器:尝试更新 UI 的速度快于人眼可以检测到的速度是没有意义的。 UI Timer 还以已知的速率将窗口消息发送到 UI 消息循环。然后,Tick 处理程序可以从共享内存中提取必要的数据以更新 UI。

这两种方法各有优缺点。选择实际上取决于将后台线程中的状态更改分组为更大块的难易程度,同时确保 UI 不会错过任何状态更改。

关于c# - 从不同线程传递数据时,是否有其他方法可以在 WPF 中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9884909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com