Один и тот же проект, разные машины, одна машина имеет проблему с перекрестными потоками - PullRequest
2 голосов
/ 10 июля 2010

У меня есть две машины, одна из которых - старый ноутбук Toshiba, который я использую дома для разработки, другая - 1-летний Делл на работе.Оба работают под управлением одной и той же версии visual studio 2008. Последние несколько месяцев я работаю над проектом для клиента.Он отлично работает на моем старом ноутбуке, но если я запускаю его в той же среде на работе, у меня возникают проблемы с многопоточностью, у кого-нибудь есть идея, почему?Есть ли в проекте / среде что-то, что мне нужно проверить или снять ...

Проблема возникла с тех пор, как я добавил элемент управления вкладками в основной пользовательский интерфейс.Ошибка перекрестного потока возникает при загрузке основной формы, когда динамический размер элемента управления вкладками - я заставил его реагировать как расширяемая панель, чтобы пользователь мог скрыть ее, если она не используется.

Этострока не включена, находится в основной секции загрузки:

expandable_tabcontrol.Left += expandable_tabcontrol.Width;

Это сообщение об ошибке:

An unhandled exception of type 'System.InvalidOperationException' 
occurred in System.Windows.Forms.dll

Additional information: Cross-thread operation 
not valid: Control 'frmUserInterFace' accessed 
from a thread other than the thread it was created on.

Работает нормально дома, не работает на работе ...

Спасибо, Р.

1 Ответ

3 голосов
/ 10 июля 2010

Трудно быть уверенным без немного большей информации, но для меня это звучит так, как метод, который выполняет изменение размера, может быть вызван в нескольких местах. Вероятно, ваш старый Toshiba представляет собой одноядерный компьютер, поэтому компьютер не может выполнять более одной операции одновременно, а размер основной вкладки изменяется. На вашей новой машине Dell, которая, вероятно, имеет несколько ядер, вторичный поток вызывает метод, который выполняет изменение размера, и это вызывает исключение.

Посмотрите на использование Control.InvokeRequired и Control.Invoke для обработки синхронизации между фоновыми потоками и потоком пользовательского интерфейса.

...