Второй подход верен: используйте BackgroundWorker
для выполнения любой работы, которая замораживает пользовательский интерфейс, если выполняется в основном потоке. Об исключении, которое вы получаете, это потому, что выполняемый вами вызов не является потокобезопасным (потому что элемент управления был создан в другом потоке, который вызывает его методы). Пожалуйста, ознакомьтесь с этой ссылкой на MSDN , чтобы понять, как выполнять вызовы такого типа между потоками, используя управляемую событиями модель backgroundWorker.
Из ссылки:
Существует два способа безопасного вызова элемента управления Windows Forms из
поток, который не создал этот элемент управления. Вы можете использовать
System.Windows.Forms.Control.Invoke
метод для вызова созданного делегата
в основном потоке, который в свою очередь вызывает управление. Или вы можете
реализовать System.ComponentModel.BackgroundWorker
, который использует
управляемая событиями модель для отделения работы, выполняемой в фоновом потоке, от
отчетность по результатам.
Взгляните на второй пример, демонстрирующий эту технику с использованием backgroundWorker
РЕДАКТИРОВАТЬ
Из ваших комментариев я понял, что настоящая проблема здесь в размере. Проблема в том, что поток, которому принадлежит элемент управления DataGridView
, является потоком, который его отображает, поэтому независимо от того, как, если вы загрузите все данные одновременно, он будет зависать на время, которое требуется этому потоку для отрисовки всех этих данных. на экране. К счастью, вы не первый, кто столкнулся с этой проблемой, и на этот раз вам помог Microsoft. Это, я думаю, отличный пример того, что проблема XY , настоящая проблема в том, что вы хотите загрузить огромный набор данных (X), и ответ о том, как это сделать, - здесь. , но вместо этого вы спросили, как отобразить значок загрузки при заполнении таблицы данных без зависания пользовательского интерфейса (Y), которое было вашей попыткой решения.
Это было с технической точки зрения, но с точки зрения UI / UX я бы хотел, чтобы вы подумали об использовании этой формы на самом деле. Вам действительно нужно загружать все эти данные каждый раз, когда вы посещаете этот раздел? Если ответ «нет», возможно, вы могли бы подумать о реализации нумерации страниц (например, здесь ). Также 200 столбцов означают горизонтальную прокрутку даже для сверхширокого монитора. Я не могу понять, в каком пользовательском случае вам нужна вся эта информация сразу в виде списка / таблицы. Я думаю, что, возможно, реализация интерфейса Master-Detail может быть более полезной.
РЕДАКТИРОВАТЬ 2,0
Я думаю, что вы можете попытаться создать совершенно новое окно Form
в другом потоке, поместите его над сеткой данных и нарисуйте там анимацию загрузки. Тем временем в главном окне вы можете нарисовать сетку без ее рисования, заставляя анимацию загрузки зависать (другой поток заботится о рисовании). Возможно, вы захотите сохранить ссылку на поток и уничтожить ее, или, может быть, лучше попытаться удержать ссылку на From и закрыть ее более изящно.
Я никогда не делал этого, но, думаю, я вспоминаю, как какое-то устаревшее приложение делало что-то подобное, и это было ужасно.