이것은 네트워크 데이터를 받고 GUI (대화 상자, 양식 등)에서 사용하기 위해 수년 동안 사용해 왔던 기술입니다.스레드에서 실시간 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와 Invoke를 사용하는 다른 방법을 발견했습니다.
내 질문 ...이 데이터 수신/GUI 업데이트를 수행하는 최신 .Net 라이브러리 (3.5, 4.0 등)에서보다 효율적인 방법이 있습니까?
이 방법이 C#에서도 잘 작동하지 않는다고 생각합니다.
도움을 주시면 감사하겠습니다.
사용자에게 초당 100 통의 알림을 던지는 것은별로 의미가 없습니다. 흐림처럼 보일 것입니다. 먼저 UI를 사용 가능하게 만들고 문제를 해결하십시오. Winforms에 변경 사항이 없습니다. –
멋진 아이디어 Hans. 스레드에 들어오는 데이터에 대한 메타 데이터를 작성하고 GUI를 매 초만 업데이트하면 Gui가 업데이트로 인해 수렁에 빠지게하면서 데이터에 대한 적절한 사용자 응답을 제공 할 수 있습니다. 일반적으로 운영자는 업데이트 된 데이터 항목의 대략적인 개수를 데이터 속도에 대한 지침으로 사용합니다. 따라서 10 초를 한눈에 50 초로 계산합니다.하지만 메타 업데이트로 통합하여 목록보기에 추가 할 수 있습니다. – Sleff