Как убедиться, что Форма полностью закрыта и удалена с дисплея, прежде чем продолжить? - PullRequest
0 голосов
/ 25 октября 2019

Я попробовал то, что увидел в этом посте , который не ответил на мой вопрос. См. Мой код и дальнейшие объяснения ниже.

// In MyForm : Form
private void SetupForImportantTask()
{
    // Does a ton of stuff to set up for ImportantTask, then...
    this.Close();
}

private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
    // otherForm is an instance of OtherForm : Form
    otherForm.ImportantTask(variousData);
}

// In OtherForm class...
public void ImportantTask(object variousData) {
    // Does a bunch of stuff that takes a long time
    // Provides UI feedback to notify the user a process in under way
}

Объяснение: Как вы можете видеть в коде, идея состоит в том, чтобы выполнить кучу настроек для ImportantTask в MyForm, затем перезвоните в OtherForm с установочной информацией после того, как MyForm уже закрылся .

То, что я вижу вместо этого:

Несмотря на то, что я не вызываю ImportantTask до тех пор, пока событие Closed на MyForm не вызовет уже запущенного , то есть семантически означает, что форма уже закрыта, MyForm остается открытой, пока поток пользовательского интерфейса зависает,пока ImportantTask не будет завершено. Уведомление пользовательского интерфейса о длительном процессе никогда не отображается, и MyForm закрывается только после завершения ImportantTask.

Если MyForm не закрывается при возникновении события Closed, как еще можноЯ определяю, что Форма действительно закрыта и удалена с экрана?

Или:

Что за глупости я пропустил?

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Чтобы ответить на ваш вопрос, форма исчезнет с экрана после запуска события Form_Closed, следовательно, после вызова каждого метода, зарегистрированного для этого события. Метод Dispose() вызывается сразу после запуска события ( из ReferenceSource , проверьте конец этого метода).

Если вы хотите убедиться, что форма исчезла, у вас естьIsHandleCreated свойство, которое сообщает вам, есть ли дескриптор, связанный с формой ( из MSDN ).

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

  • Пользовательский ввод должен быть отфильтрован, а ваша форма должна запускать события, которые класс контроллера будет перехватывать и обрабатывать в другом потоке.
  • Когда контроллер завершает ввод данных пользователем, он должен сообщитьформа, в которой можно обновить дисплей.
1 голос
/ 25 октября 2019

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

Другими словами,метод A не завершается до тех пор, пока метод B (вызываемый методом A) не вернет поток управления вызывающей стороне.

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

конечно, заплатитевнимание к жизненному циклу объектов, и в конечном итоге метод, который вы решите использовать, зависит от остальной части приложения и от вашего вкуса.

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