gpt4 book ai didi

c# - 从线程加速实时 Gui 更新

转载 作者:太空狗 更新时间:2023-10-29 23:18:18 27 4
gpt4 key购买 nike

这是我多年来用来接收网络数据并在我的 GUI(对话框、表单等)中使用它的技术。

    public delegate void mydelegate(Byte[] message);

public ReceiveEngineCS(String LocalIpIn, String ReceiveFromIp, mydelegate d)
{
this.m_LocalIpIn = LocalIpIn;
this.m_ReceiveFromIp = ReceiveFromIp;
m_MainCallback = d;
SetupReceive();
m_Running = true;
//Create the Track receive thread and pass the parent (this)
m_RtdirReceiveThread = new Thread(new ParameterizedThreadStart(MessageRecieveThread));
m_RtdirReceiveThread.Start(this);
}

private void MessageRecieveThread(System.Object obj)
{
ReceiveEngineCS parent = (ReceiveEngineCS)obj;

while(parent.m_Running)
{
Byte[] receiveBytes = new Byte[1500];
try
{
receiveBytes = parent.m_ClientReceiver.Receive(ref parent.ipEndPoint);
parent.ThreadOutput(receiveBytes);
}
catch ( Exception e )
{
parent.StatusUpdate(e.ToString());
}
}
}

public void ThreadOutput(Byte[] message)
{
m_MainCallback(message);
}

public partial class SystemMain : Form
{
//Local Class Variables
Network.ReceiveEngineCS SystemMessageReceiver;
private void Form1_Load(object sender, EventArgs e)
{
//Load up the message receiver
SystemMessageReceiver = new Network.ReceiveEngineCS(localAddy, fromAddy, new mydelegate(LocalDelegate));
}

public void LocalDelegate(Byte[] message)
{
if (Form.ListView.InvokeRequired)
{
//External call: invoke delegate
Form.ListView.Invoke(new mydelegate(this.LocalDelegate), message);
}
else
{
//Get the Packet Header
Formats.PacketHeaderObject ph = new Formats.PacketHeaderObject(message);
//Update or Add item to Specific ListView
... update views
}
}
}

接收器每秒接收 10 到 100 条实时消息,通常更多。

我最近一直在研究 .Net 4.0 和 C#,并注意到许多其他类似的方法来进行这种数据处理,例如工作线程,以及其他使用委托(delegate)和调用的方式。

我的问题...在较新的 .Net 库(3.5、4.0 等)中是否有更有效的方法来执行此数据接收/GUI 更新?

我认为此方法不适用于 C#。

如有任何帮助,我们将不胜感激。

最佳答案

将更新发布到 GUI 的最佳方法之一是让工作线程打包更新中包含的数据并将其放入队列中。然后 UI 线程将定期轮询队列。让工作线程使用 Control.Invoke 来更新 UI 在我看来是方式过度使用的。相比之下,让 UI 线程轮询更新有几个优点。

  • 它打破了 Control.Invoke 强加的 UI 和工作线程之间的紧密耦合。
  • 它将更新 UI 线程的责任放在它应该属于的 UI 线程上。
  • UI 线程可以决定更新的时间和频率。
  • 不存在 UI 消息泵溢出的风险,而工作线程启动的编码(marshal)处理技术会出现这种情况。
  • 工作线程不必等待执行更新的确认就可以继续执行后续步骤(即,您在 UI 和工作线程上获得更多吞吐量)。

您没有提到 ThreadOutput 是如何实现的,但如果尚未采用我上面提到的方法,您可能会考虑这种方法。经验告诉我,这通常是最好的方法。让 UI 线程限制其更新周期是一个很大的优势。

关于c# - 从线程加速实时 Gui 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774009/

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