Проблема с видимостью формы - PullRequest
0 голосов
/ 06 августа 2011
Form1.button_Click(...) {
    // Show a dialog form, which runs a method <CheckBalance()> on it's OnLoad Event.
    var modemDialog = new ModemDialog("COM25");
    modemDialog.ShowDialog();
    // the user can't see this dialog form until the method <CheckBalance()> terminates.
}

Можно ли сначала показать диалоговое окно, а затем запустить указанный метод?БЛАГОДАРЯ.

Ответы [ 3 ]

1 голос
/ 06 августа 2011

Это правильно и ожидаемо.Пользовательский интерфейс Winforms является однопоточным.Наличие вызова функции, такого как «CheckBalance» в событии загрузки формы, будет препятствовать отображению формы до завершения события загрузки формы.В зависимости от продолжительности задачи у вас есть несколько доступных вариантов:

  1. Если это быстрое задание, рассчитайте его заранее, прежде чем показывать форму
  2. Если эточто-то, что пользователь может захотеть инициировать, переместите его на кнопку в новой форме, чтобы оно рассчитывалось только по запросу пользователя
  3. Если это долгосрочное задание, которое занимает некоторое время, вам потребуетсяпереместить его в другой поток.Рекомендуется использовать BackgroundWorker .
0 голосов
/ 06 августа 2011

Простой способ убедиться, что ваша форма видима перед запуском CheckBalance, - использовать этот код в обработчике загрузки формы:

this.BeginInvoke((Action)(() => this.CheckBalance()));

Это приведет к выполнению метода CheckBalance в потоке сообщений потока пользовательского интерфейса, поэтому он будет выполняться после завершения всего предыдущего кода пользовательского интерфейса.

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

0 голосов
/ 06 августа 2011

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

Если вы хотите асинхронно запустить метод CheckBalance(), то вы можете использовать несколько методов, таких как использование Threading, ThreadPool или Tasks API, чтобы переместить эту работу в фоновый поток, и немедленный возврат к форме показано на рисунке.

Вот пример использования Задачи для выполнения того же действия, но асинхронно, так что форма сразу показывает:

Action<object> action = () => { CheckBalance(); };
new Task(action).Start();

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

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