Лучшее, что нужно сделать в этой ситуации, - прежде чем вы на самом деле вызовете закрытие формы, вы уведомите все свои системы, которые собираетесь закрыть, что даст вам возможность запустить любой процесс в конце. Когда вы закончите и захотите закрыть форму из другого потока, вам нужно будет вызвать ее в потоке пользовательского интерфейса, используя:
_hostForm.BeginInvoke(new Action(() => _hostForm.Close()));
Возможно, было бы лучше, если бы вы всегда закрывали форму из другого потока, чтобы на самом деле создать потокобезопасную версию метода close; i.e.:
public class MyForm : Form
{
// ...
public void SafeClose()
{
// Make sure we're running on the UI thread
if (this.InvokeRequired)
{
BeginInvoke(new Action(SafeClose));
return;
}
// Close the form now that we're running on the UI thread
Close();
}
// ...
}
Используя такой подход, вы можете продолжать обновлять форму и ее интерфейс во время выполнения асинхронных операций, а затем вызывать завершение работы и очистку по завершении.