обновление bindingList в потоке пользовательского интерфейса, используя invoke несколько раз - PullRequest
0 голосов
/ 30 декабря 2010

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

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

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

1 Ответ

0 голосов
/ 07 апреля 2011

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

Для этого вам, возможно, придется использовать BindingList (чтобы обновления в источнике отражались в Target (в данном случае это Grid)

...