под окнами элементы управления должны обновляться в основном потоке приложения или графического интерфейса, а не из рабочих потоков, как вы подозревали.Основная причина этого заключается в том, что элементы управления используют 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, не говоря уже о том, что некоторые сообщения могут быть потеряны.Реально, однако, вам нужно было бы приложить немало усилий, чтобы это произошло, и оно идет рука об руку с любыми другими требованиями к производительности.
надеюсь, что все пройдет хорошо
эта статья описывает ее дальше.