2014-12-15 11 views
0

Я борюсь с этим исключением под Windows Mobile 6,5Проблемы с настраиваемым обращаются TextBoxes и KeyDown/методами DoubleClick

System.NotSupportedException was unhandled 
Message="Control.Invoke must be used to interact with controls created on a separate thread." 
StackTrace: 
in Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar) 
in System.Windows.Forms.Control.Dispose(Boolean disposing) 
in OpenNETCF.Windows.Forms.OwnerDrawnList.Dispose() 
in OpenNETCF.Windows.Forms.OwnerDrawnList.Finalize() 

Я использую список из текстовых OPENNETCF как смотрит меню фантазии. Они сделаны на заказ, но я обнаружил, что ничего не случилось с удалением/созданием всех этих объектов, пока не будет вызван метод в DoubleClick или KeyDown. В этом методе я запускаю DataGrid и все, что всегда срабатывало.

Как только я выхожу из основной формы, это исключение выбрасывается. Это никак не влияет на приложение, за исключением этого большого уродливого исключения win32 в конце использования приложения. Что мне не хватает? Я удаляю эти объекты перед перерисовыванием формы.


@EDIT мне удалось это исправить путем размещения все эти объекты не Form.Disposed событие, которое действует после того, как расположен родительский класс, но в Form.Closing случае. Я предполагаю, что NETCF использует некоторые потоки в фоновом режиме, которые удаляются с помощью windows.form.

+0

Вы используете отдельные потоки? Ошибка обычно наблюдается, если вы пытаетесь вызвать функцию из фонового потока. У вас есть специальный код очистки (Dispose) в контроле владельца? – josef

+0

Единственный отдельный поток, который я использую, - это таймер, который ничего не делает на этих объектах. Я не переопределял метод dispose для этих TextBoxes, но выполняю итерацию по списку, который их содержит, и вызывается метод .Dispose() для каждого из них, тогда я устанавливаю значение null. – Luntri

ответ

1

Причина, по которой вы кричите о вызове метода управления из другого потока, состоит в том, что вы разрешаете сборщику мусора очищать ваши элементы управления, а когда он очищает, GC заканчивает вызов Dispose для вас. Причина, по которой его говорит другой поток, вызывает ваши элементы управления, потому что сборщик мусора работает в отдельном потоке. Чтобы исправить свою проблему, вы можете использовать оператор Using или напрямую вызывать Dispose в своей форме, когда ваша программа закрывается.