Добавление элементов управления в winform, позволяя пользователю вводить данные - PullRequest
1 голос
/ 01 апреля 2011

У меня есть форма ввода данных WinForms, которая будет иметь более 1500 вопросов.У меня есть вопросы, разбитые на разделы, и у каждого раздела будет неизвестное количество вопросов.Каждый раздел является собственным пользовательским элементом управления и имеет строки (2 панели, 2 метки, текстовое поле и другой пользовательский элемент управления), которые создаются и добавляются динамически для каждого вопроса.Затем в форму добавляются элементы управления разделами.

Моя проблема в том, что этот процесс занимает много времени, даже с использованием TPL (Task Parallel Library).В конечном итоге я хотел бы создать / добавить элементы управления и позволить пользователю начать ввод данных одновременно.Элементы управления собираются в прокручиваемую панель.Пока пользователь вводит данные, эти данные нужно будет обработать в локальной базе данных ... поэтому может потребоваться дополнительная обработка потоков.

Я попытался работать с TPL, который я новичок, имея все элементы управлениядобавление в список во время обработки, а затем сортировка и добавление в форму после завершения Parallel.ForEach ... занимает около 20 секунд для более 1200 вопросов.

Я также пытался использовать компонент BackgroundWorker.Использование BWC кажется более быстрым из этих двух, но для обработчика событий ProgressChanged() есть условие гонки, и не все элементы управления добавляются ... не говоря уже о том, как форма выглядит при всех перерисовках.

Я просто использую TPL неправильно?Какой лучший способ пойти по этому поводу?Есть ли другой способ или я просто заставляю пользователя торчать?

Спасибо

1 Ответ

1 голос
/ 01 апреля 2011

Я просто использую TPL неправильно?Какой лучший способ пойти по этому поводу?Есть ли другой способ, или я просто заставляю пользователя затягивать ожидание?

Скорее всего, вы можете использовать TPL и получить то же время отклика, что и BW, но более приятный API для этого типаоперация.

Хитрость заключается в том, чтобы получить настройку TaskScheduler для взаимодействия с пользовательским интерфейсом, а затем с помощью класса Task вернуть элементы управления обратно в поток пользовательского интерфейса, когда они будут готовы.У меня есть сообщение в блоге на эту конкретную тему , в котором показано, как получить настройку TaskScheduler для использования с потоками пользовательского интерфейса.

Тем не менее, я бы порекомендовал хранить их в памяти и передавать их порциями,чтобы избежать повторного рендеринга пользовательского интерфейса.Скорее всего, это проблема, независимо от того, что вы делаете.

Как говорится, я бы поставил под сомнение ваш общий визуальный дизайн здесь - если вы пытаетесь отобразить более 1200 вопросов пользователю, некоторыеФорма подкачки, вероятно, гораздо приятнее, чем огромный прокручиваемый контейнер.Если вы перелистываете их, вы можете загрузить и обработать первые несколько (что, вероятно, почти мгновенно, поскольку вы упомянули, что вы можете обработать около 50 вопросов в секунду), а затем продолжить загрузку остальных после отображения первых нескольких вопросов.

...