【发布时间】:2011-04-24 23:46:04
【问题描述】:
这是我多年来用来接收网络数据并在我的 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#,并注意到许多其他类似的方法来进行这种数据处理 ,比如 Worker Threads,以及其他使用 Delegate 和 Invoke 的方式。
我的问题...在较新的 .Net 库(3.5、4.0 等)中是否有更有效的方法来接收数据/更新 GUI?
我认为这种方法不适用于 C#。
任何帮助将不胜感激。
【问题讨论】:
-
每秒向用户发送一百个通知没有多大意义。它看起来像一个模糊。首先让您的 UI 可用,也可以解决您的问题。 Winforms 没有变化。
-
好主意汉斯。如果我在线程中建立有关传入数据的元数据并且仅每秒左右更新一次 gui 它仍然会给用户提供关于数据的体面响应,同时允许 Gui 不会陷入更新的困境。通常,运营商使用更新数据项的粗略计数作为数据速率的指导。因此,一目了然地以每秒 10 次 50 次等计算。但我可以将其合并为元更新并将其添加到列表视图中。
标签: c# multithreading networking delegates invoke