Загрузка таблицы данных при загрузке формы, как ускорить ее в c # - PullRequest
0 голосов
/ 11 октября 2011

У меня есть форма окна c #, когда она открывается, она загружает тысячи записей для заполнения таблицы данных, проблема в том, что когда я нажимаю на форму, она показывает пустое окно в течение некоторого времени перед отображением всех данных, поэтому

Как отобразить знак ожидания в сетке данных при загрузке данных и позволить отображению другого элемента управления формы?

как я могу ускорить его, я готов выполнять работу с потоками, если он выполняет свою работу.

Ответы [ 6 ]

1 голос
/ 11 октября 2011

Вы можете абсолютно использовать потоки для этого. В основном он состоит в запуске другого потока для запроса к базе данных, пока вы отображаете какое-то загрузочное сообщение для вашего пользователя.

Вот некоторая документация:

Класс резьбы MSDN

И пример кода:

Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();

Где ThreadProc должен быть вашим методом загрузки данных.

Позвольте мне уточнить немного:

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

0 голосов
/ 15 апреля 2018

Я решил это очень абстрактным решением:

Поместите элемент управления timer1 в вашу форму.Поместите код загрузки данных в таймер timer1_Tick.Для загрузки данных во время загрузки формы, затем вызовите timer1.Start ();Важно, чтобы вы непосредственно остановили интервал в timer1_Tick перед загрузкой данных, чтобы предотвратить множественные вызовы.

    private void Form1_Load(object sender, EventArgs e)
    {            
        timer1.Interval = 10;
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();
        LoadData();
    }

При этом используется поток Windows.Forms.Timer с полным доступом ко всем элементам управления в форме.

0 голосов
/ 11 октября 2011

Вам нужен фоновый поток.Вы можете настроить BackgroundWorker в своей форме или настроить базовую асинхронную модель с BeginInvoke в вашем обработчике событий, которому после завершения будет предоставлен другой метод в качестве обратного вызова.В фоновом режиме выполните весь процесс извлечения данных, а затем снова вызовите основной поток, когда вам нужно заполнить DGV (что должно занять гораздо меньше времени, когда вся информация будет в памяти).

* 1002проблема заключается в том, что пока основной поток занят, ожидая, когда БД вернется со всеми строками, система не может отвечать на любые другие пользовательские вводы или сообщения Windows (например, «перерисовать себя»).Windows увидит, что очередь сообщений для этого приложения выполняет резервное копирование, и пометит приложение как «не отвечающее».Не очень приятный пользовательский опыт.
0 голосов
/ 11 октября 2011

Вы можете использовать асинхронные запросы в сочетании с частичными результатами.

Если ваша система баз данных не поддерживает предложение LIMIT, общее в MySQL для указания частичных результатов, вы можете использовать подходкак это .

0 голосов
/ 11 октября 2011

использовать компонент backgroundworker. С ним легче справиться, чем нарезать Кроме того, вы можете использовать асинхронные методы, предоставляемые ado.net, такие как beginexecutereader и т. Д.

0 голосов
/ 11 октября 2011

Вы должны использовать BackgroundWorker class.

...