Я унаследовал приложение Winforms, которое выполняет много длительных вызовов на сервер приложений из потока пользовательского интерфейса, поэтому пользовательский интерфейс остается невосприимчивым, непригодным к использованию, незаменимым в течение довольно длительного времени , (Это делает меня действительно пойти AAAAAAAAARGH!)Как заблокировать пользовательский интерфейс Winforms при запуске фонового потока
Я планирую переместить сервер вызовов в фоновом потоке и есть пользовательский интерфейс отключен - но подвижный & закрываемой - в то время как фоновый поток делает свою работу.
Итак, что было бы лучшим способом заблокировать ввод пользователя в мое приложение? Я размышляю о «модальном диалоге прогресса», но я бы предпочел решение, которое не заставило меня бросать визуальные изображения в лицо пользователю (некоторые операции с сервером выполняются в пределах менее 500 мс, поэтому диалог не оптимальный ...)
Есть ли какой-либо способ в Winforms, чтобы пользователь не запускал действия или не изменял данные в приложении, а пропускал несколько отдельных вещей (изменять размер, показывать, скрывать и семью, а пользователь закрывает окно)? Я бы предпочел способ, который не заставляет меня обращаться к каждому элементу пользовательского интерфейса в моих формах и устанавливать его на отключенный ... их довольно много, и это приложение действительно «взломано в дизайнере пользовательского интерфейса», пока оно не покажет яркие вещи "стиль исходного кода. Ни в коем случае рефакторинга КАЖДЫЙ вонючий вещь до даты выпуска ...
О, кстати, это приложение живет в рамках .net 2
Почему вы просто отключили кнопку, которая инициировала длительный вызов? –
Пользовательский интерфейс - это форма ввода данных, длительный вызов может быть «сохраненным», включающим множество объектов домена. Я хочу, чтобы пользователь не изменял данные в форме, пока, к примеру, выполняется сохранение. Кстати, ЭТО (http://stuffthathappens.com/blog/2008/03/05/simplicity) является истинным ... – froh42
, когда вы хотите включить обратно форму? если вы попытаетесь сделать это в событии «_RunWorkerCompleted», вы получите исключение, потому что вам не разрешено (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx - первое примечание). Вы можете делать это вручную только для каждого элемента в форме или для первого контейнера. – Edd