Асинхронное заполнение сетки данных в приложении Windows Forms - PullRequest
1 голос
/ 31 августа 2009

Howzit!

Я веб-разработчик, которого недавно попросили разработать приложение для форм Windows, поэтому, пожалуйста, потерпите меня (или не смейтесь!), Если мой вопрос немного элементарен.

После многих сессий с моим клиентом мы в конечном итоге выбрали интерфейс, который содержит tabcontrol с 5 вкладками. Каждая вкладка имеет сеточное представление, которое может в конечном итоге содержать до 25 000 строк данных (по 6 столбцов в каждой). Мне удалось связать сетки, когда загружена закладка, и она отлично работает для нескольких записей, но пользовательский интерфейс зависает, когда я связываю сетку с 20 000 фиктивных записей. «Замораживание» происходит, когда я нажимаю на саму вкладку, а пользовательский интерфейс освобождается (и страница вкладки отображается) только после завершения привязки.

Я сообщил об этом клиенту и упомянул возможность подкачки для каждой сетки, но она является дополнением w.r.t. НЕ желая этого. Тогда мой единственный вариант - это найти какой-то асинхронный способ сделать это в фоновом режиме. Я не очень разбираюсь в многопоточности оконных форм, но знаю, что для этого могу использовать элемент управления BackgroundWorker. Моя единственная проблема после того, как я немного прочел об этом, заключается в том, что он идеально подходит для «длительных» задач и операций ввода-вывода.

Мои вопросы:

  1. Как определить долгосрочную задачу?
  2. Как НЕ ПРОПУСТИТЬ элемент управления BackgroundWorker, т.е. есть ли общие рекомендации, которым нужно следовать при использовании этого? (Я понимаю, что открытие / создание нескольких потоков может быть нежелательным в некоторых случаях)
  3. Самое главное: как можно (асинхронно) выполнить привязку просмотра данных после вкладки - и всех ее дочерних элементов управления - загрузки.

Спасибо за чтение этого длинного ( гм ) запроса, и я очень ценю любые ответы / мысли / указания по этому вопросу!

ура!

1 Ответ

1 голос
/ 31 августа 2009
  1. Нет жесткого и быстрого правила для определения долгосрочной задачи. Это то, что вы должны знать как разработчик. Вы должны понимать природу ваших данных и вашу архитектуру. Например, если вы ожидаете получить некоторую информацию из базы данных рабочего стола с одним пользователем из таблицы, содержащей пару десятков строк, вы можете даже не показывать курсор ожидания. Но если вы извлекаете сотни строк данных по сети на общий сервер базы данных, вам лучше ожидать, что это будет потенциально длительная задача, которая будет обрабатываться не просто курсором ожидания, а потоком, который освобождается. Ваш пользовательский интерфейс на время получения. (Вы определенно на правильном пути здесь.)

  2. BackgroundWorker - быстрый и грязный способ обработки потоков в формах. В вашем случае это будет очень сильно привязывать выборку данных к пользовательскому интерфейсу. Это выполнимо, работает нормально, но, конечно, не считается «наилучшей практикой» для многопоточности, ООП, разделения задач и т. Д. И если вы беспокоитесь о злоупотреблении распределением потоков, вы можете прочитать о ThreadPool .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...