2010-12-30 2 views
0

У меня есть приложение, где мне нужно обновить представление на основе сообщений, полученных от службы wcf. Я использую MVP для ui. В представлении есть dataGridView в форме выигрыша, в котором он показывает полученные сообщения. У меня есть список привязки для этого представления в моем презентаторе.Обновление bindingList в потоке ui с использованием вызова несколько раз

Обновляю список привязок, вызывая invoke на dataGridView. Мой вопрос: если я получаю много сообщений (~ 10/сек), имеет смысл собирать все эти сообщения в отдельном списке, а затем внутри вызова вызова, добавлять их в список привязки или вызывать вызов для добавления каждого сообщения к списку привязки.

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); 
     } 
    } 
} 

ответ

0

Вы пытались использовать BindingSource. вы можете приостановить привязки (чтобы вы могли добавлять новые элементы в свой список, а затем возобновлять его). Таким образом, ваша сетка получит массовые обновления.

Возможно, вам понадобится использовать BindingList (так, чтобы обновления на источнике отражались в Target (который является сеткой в ​​вашем случае)