gpt4 book ai didi

c# - Winforms 我应该多线程还是使用事件计时器?

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

我目前有一个线程用于监听来自网络的数据,然后在其上运行规则。然后我想将数据传递给 GUI。我担心在 GUI 中出现死锁。我不知道是要把互斥体放在 GUI 端。我也在使用 c# 和 dotnet 3.5。

我想到的是1) 使用计时器创建事件并转储线程。担心性能。2) 使用中间事件将数据复制到 GUI。3) 深入研究并找出使用 GUI 的线程安全方式。

您认为最好的方法是什么?

编辑:这是我正在使用的解决方案。我传入更改后的元素,然后用互斥量保护大对象。我使用辅助函数使用 InvokeRequired 然后使用委托(delegate) BeginInvoke 来切换线程。从阅读答案中拉出来,然后点击链接直到到达 Threading in Windows Forms通过 Jon Skeet .

  delegate void UInt32ParameterDelegate(UInt32 n);

public void UpdateLocation(UInt32 n)
{
if (InvokeRequired)
{
// We're not in the UI thread, so we need to call BeginInvoke
BeginInvoke(new UInt32ParameterDelegate(UpdateLocation), new object[] { n });
return;
}
// Must be on the UI thread if we've got this far

this.engine.location.UpdateBusy.WaitOne();
// do the work in here

this.engine.location.UpdateBusy.ReleaseMutex();

}

最佳答案

Windows 窗体中的同步非常容易。您可以在后台线程中调用 Control.Invoke()。线程将停止,直到委托(delegate)完成在 UI 线程上的运行。根本不需要同步。

如果停止线程是一个问题,请使用 Control.BeginInvoke()。如果线程在继续运行时可能会更改它们,则必须使用锁来保护传递给委托(delegate)的对象。在生产者-消费者场景中很少出现这种情况,线程可以简单地创建新对象。

请确保您不会过于频繁地调用 ()。如果执行频率超过每秒 1000 次,UI 线程将停止发送 Windows 消息,并因处理调用请求而陷入困境。由于您要取悦的是人眼,每秒调用超过 25 次只是浪费精力。将中间结果合并到一个集合对象中。

关于c# - Winforms 我应该多线程还是使用事件计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/615467/

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