我需要每秒處理 4000 個訊息包,總共來自 80 個不同的 ID。我有一個DataGrid. 我已ObservableCollection系結到 DataGrid。我嘗試了 2 種方法來重繪 UI 而不會凍結。我兩方面都沒有成功。
1.方式
如果有來自不同 ID 的訊息,我會將其添加到我的收藏中。如果它來自相同的 ID,我洗掉舊的并獲取新的。
if (MessagePacket._jobs.Where(X => X.ID == dataPacket.ID).FirstOrDefault() == null)
{
MessagePacket._jobs.Add(dataPacket);
}
else
{
for (int x = 0; x < MessagePacket._jobs.Count; x )
{
if (MessagePacket._jobs[x].ID == dataPacket.ID)
{
MessagePacket._jobs.RemoveAt(x);
MessagePacket._jobs.Add(dataPacket);
}
}
}
2種方法
我正在修改資料而不洗掉它并重繪 集合。
注意:我嘗試每 50 毫秒重繪 一次集合,而不是每次打包后。它仍然很慢。
if (MessagePacket._jobs.Where(X => X.ID == dataPacket.ID).FirstOrDefault() == null)
{
MessagePacket._jobs.Add(dataPacket);
}
else
{
for (int x = 0; x < MessagePacket._jobs.Count; x )
{
if (MessagePacket._jobs[x].ID == dataPacket.ID)
{
MessagePacket._jobs[x].DLC = dataPacket.DLC;
MessagePacket._jobs[x].RTR = dataPacket.RTR;
MessagePacket._jobs[x].IDE = dataPacket.IDE;
MessagePacket._jobs[x].Byte0 = dataPacket.Byte0;
MessagePacket._jobs[x].Byte1 = dataPacket.Byte1;
MessagePacket._jobs[x].Byte2 = dataPacket.Byte2;
MessagePacket._jobs[x].Byte3 = dataPacket.Byte3;
MessagePacket._jobs[x].Byte4 = dataPacket.Byte4;
MessagePacket._jobs[x].Byte5 = dataPacket.Byte5;
MessagePacket._jobs[x].Byte6 = dataPacket.Byte6;
MessagePacket._jobs[x].Byte7 = dataPacket.Byte7;
MessagePacket._jobs[x].Time = DateTime.Now.ToString("HH:mm:ss");
CollectionViewSource.GetDefaultView(MessagePacket._jobs).Refresh();
}
}
}
如何在不凍結用戶界面的情況下加快行程。或者你能展示另一種方式嗎?從現在開始謝謝你。
uj5u.com熱心網友回復:
這樣的事情應該更有效:
var p = MessagePacket._jobs.FirstOrDefault(x => x.ID == dataPacket.ID);
if (p == null)
{
MessagePacket._jobs.Add(dataPacket);
}
else
{
int i = MessagePacket._jobs.IndexOf(p);
MessagePacket._jobs[i] = dataPacket;
}
你也可以考慮_jobs 變成一個ObservableDictionary,這樣你就可以簡單地寫
MessagePacket._jobs[dataPacket.ID] = dataPacket;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331421.html
