Ich habe eine Anwendung, wo ich die Ansicht basierend auf den Nachrichten von einem WCF-Dienst erhalten aktualisieren müssen. Ich benutze den MVP für die ui. Die Ansicht hat eine dataGridView auf einem Gewinnformular, in dem die empfangenen Nachrichten angezeigt werden. Ich habe eine verbindliche Liste für diese Ansicht in meinem Referenten.Aktualisieren von BindingList auf dem ui Thread mit mehrmals aufrufen
Ich aktualisiere die Bindungsliste durch Aufrufen von in der DataGridView aufrufen. Meine Frage ist, wenn ich viele Nachrichten (~ 10/sec) empfange, macht es Sinn, alle diese Nachrichten in einer separaten Liste zu sammeln und dann innerhalb des Aufrufs hinzuzufügen, fügen Sie sie der Bindungsliste hinzu oder rufen Sie invoke zum Hinzufügen jeder Nachricht auf zur verbindlichen Liste.
public class Presenter
{
private List<ClientMessage> newMessages;
private BindingList<ClientMessage> messageDataSource;
public void Presenter()
{
newMessages = new List<ClientMessage>();
Views.AuditorGridView.DataSource = messageDataSource;
}
public void ReceiveMessages(List<ClientMessage> messageList)
{
//...some other message related processing
foreach (ClientMessage message in messageList)
{
if (messageIdList.Contains(message.ID)) continue;
messageIdList.Add(message.ID);
messageDataSource.Add(message);
View.gridView.BeginInvoke(new InvokeDelegate(GridInvokeMethod1));
}
}
private void GridInvokeMethod1()
{
Views.AuditorGridView.DataSource = messageDataSource;
}
//OR
public void ReceiveMessages(List<ClientMessage> messageList)
{
//...some other message related processing
newMessages.Clear();
foreach (ClientMessage message in messageList)
{
if (messageIdList.Contains(message.ID)) continue;
messageIdList.Add(message.ID);
newMessages.Add(message);
}
View.gridView.BeginInvoke(new InvokeDelegate(GridInvokeMethod2));
}
private void GridInvokeMethod2()
{
foreach (ClientMessage message in newMessages)
{
messageDataSource.Add(message);
}
}
}