Утилизация формы ожидаемым методом внутри - PullRequest
0 голосов
/ 22 апреля 2020

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

using (var riskForm = new RiskValidationForm(config))
{
   if (riskForm.OpenDialog() == DialogResult.Cancel)
      return;

   await Task.Run(() => MyMethod(riskForm.GetRiskData());
}

Опасно ли это? Я боюсь, что форма может избавиться, избавившись от того, что RiskData () возвращает до запуска ожидаемого метода. Следовательно, я буду вызывать RiskData () для чего-то, что уже утилизировано. Возможно ли это?

Функция подписи MyMethod:

private void MyMethod(RiskLimitsConfigurationCollection riskLimits)

1 Ответ

1 голос
/ 22 апреля 2020

Нет, невозможно, чтобы Form был утилизирован до завершения Task. await внутри оператора using гарантирует это. Но даже если вы удалите комбинацию using / await (сделав задачу по сути «забей и забудь»), проблем не будет. Сборщик мусора не перерабатывает объекты, которые все еще используются. Task будет содержать ссылку на закрытие , которое будет содержать ссылку на RiskValidationForm, а Task объекты не будут переработаны до их завершения (если приложение не является прекращено).

У вас есть еще две причины для беспокойства:

  1. Вам нужно беспокоиться о поточной безопасности метода MyMethod. Он может вызываться несколькими потоками одновременно, если только не существует кода UI, который предотвращает его возникновение (например, путем отключения активации Button, пока задача еще выполняется).
  2. Вам нужно беспокоиться о сродстве потока метода GetRiskData. Если этот метод обращается к какому-либо методу или свойству какого-либо элемента управления пользовательского интерфейса формы RiskValidationForm, вы допустили межпотоковое нарушение , поскольку вы получили доступ к элементу пользовательского интерфейса из потока, отличного от потока пользовательского интерфейса.
...