GUI hænger (listview)
Hej eksperter,Jeg har et listview,som opdateres, når der kommer en ny besked (beskeden kommer som en xml-fil, som læses), og når beskeden er håndteret. Det går fint med at opdatere mit listview hvis der ikke kommer så mange beskeder på én gang. Jeg prøvede så at fyre 1000 beskeder afsted på én gang, men det kunne listviewet ikke lide. Så begyndte GUIen at hænge. Jeg benytter begininvoke og delegates til at opdatere listviewet, men det hænger alligevel. Nogen idéer ?
Nedenfor er min kode:
/// <summary>
/// Update listview when a new message is received
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void incoming_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (messagesListView.InvokeRequired)
{
IAsyncResult res= this.messagesListView.BeginInvoke(new
UpdateIncomingMessageHandler(incoming_MessageReceived), new
object[] { sender, e });
}
else
{
lock (incoming_MessageReceivedLock)
{
//add new entry to the listview
ListViewItem item = new ListViewItem(e.ToString());
item.Name = e.UniqueID.ToString();
item.SubItems.Add(DateTime.Now.ToString());
item.SubItems.Add(e.Message.ToString());
if (e.HandlingDone == true)
{
item.SubItems.Add(e.HandledSuccesfully.ToString());
item.SubItems.Add(e.ErrorMessage);
}
else
{
item.SubItems.Add("Handling in progress");
item.SubItems.Add("Handling in progress");
}
item.SubItems.Add(e.ToFormattedString());
//update the item in the listview if it is already
//present otherwise add item
if (messagesListView.Items.ContainsKey(item.Name) == true)
{
//retrieve the existing item and it's position (index) in the
//listview
ListViewItem existingItem=messagesListView.Items[item.Name];
//if the original item was selected, so should the new item be
bool existingItemIsSelected = existingItem.Selected;
if (existingItemIsSelected == true)
item.Selected = true;
//replace the original item
int index = messagesListView.Items.IndexOf(existingItem);
messagesListView.Items.Insert(index, item);
messagesListView.Items.Remove(existingItem);
}
else
messagesListView.Items.Add(item);
//update number of handled messages
incomingListGroupBox.Text = "Incoming messages(" +
messagesListView.Items.Count.ToString() + ")";
}
}
}
