Как обновить ListView из службы WCF? - PullRequest
1 голос
/ 23 июня 2011

У меня есть служба WCF, размещенная в приложении Windows Forms (.NET C # 4). Это работает в своем собственном потоке. Когда метод вызывается в службе WCF, я хочу обновить список (т.е. список), а затем ListView в форме добавляет строку на экран.

Каков наилучший способ добиться этого?

1 Ответ

1 голос
/ 09 июля 2011

под окнами элементы управления должны обновляться в основном потоке приложения или графического интерфейса, а не из рабочих потоков, как вы подозревали.Основная причина этого заключается в том, что элементы управления используют Windows Message Pump , который должен обрабатываться основным потоком.

для обновления элемента управления из потока, не являющегося пользовательским интерфейсом, который вы поток-маршал данные из рабочего потока в поток пользовательского интерфейса;в .net это легкое дело.вы создаете метод обратного вызова делегата, который вызывается через BeginInvoke () или Invoke (), которые асинхронны и синхронны соответственно.

myListBox.BeginInvoke(new MyDelegate(DelegateMethod), "hi there");

public void DelegateMethod(ListView myControl, string message)
{
   myControl.Items.Add (message);
}

В зависимости от ваших требований к производительности, вы можете использовать BeginInvoke (), чтобы обновление выполнялось в фоновом режиме, а не Invoke (), которыйблокирует рабочий поток.Однако следует учитывать, что если вы сделаете слишком много BeginInvoke () за интервал времени, это может снизить производительность вашего приложения из-за перегрузки Windows Message Pump, не говоря уже о том, что некоторые сообщения могут быть потеряны.Реально, однако, вам нужно было бы приложить немало усилий, чтобы это произошло, и оно идет рука об руку с любыми другими требованиями к производительности.

надеюсь, что все пройдет хорошо

эта статья описывает ее дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...