Как дождаться закрытия формы?

215
21 февраля 2019, 17:20

Пишу автономное приложение, я вызываю форму

Form f1 = new Form1();
f1.Show();
while(true)
{
if (//Форма закрта)
break;
}
//дальнейший код

в ней срабатывает таймер, который запускает последовательность действий, после чего происходит this.Close();

Как я могу проверить, что форма закрылась из основной(родительской)?

Answer 1

Как-то так (.NET 4.5+):

using System;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Reflection;
...
//Вспомогательный метод: Создает объект Task, который может использоваться для ожидания срабатывания указанного события 
public static Task<object> GetTaskFromEvent(object o, string evt)
{
    if (o == null || evt == null) throw new ArgumentNullException("Arguments cannot be null");
    EventInfo einfo = o.GetType().GetEvent(evt);
    if (einfo == null)
    {
        throw new ArgumentException(String.Format("*{0}* has no *{1}* event", o, evt));
    }
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    MethodInfo mi = null;
    Delegate deleg = null;
    EventHandler handler = null;
    //код обработчика события
    handler = (s, e) =>
    {
        mi = handler.Method;
        deleg = Delegate.CreateDelegate(einfo.EventHandlerType, handler.Target, mi);
        einfo.RemoveEventHandler(s, deleg); //отцепляем обработчик события
        tcs.TrySetResult(null); //сигнализируем о наступлении события
    };
    mi = handler.Method;
    deleg = Delegate.CreateDelegate(einfo.EventHandlerType, handler.Target, mi); //получаем делегат нужного типа
    einfo.AddEventHandler(o, deleg); //присоединяем обработчик события
    return tcs.Task;
}

private async void button1_Click(object sender, EventArgs e)
{
    Form f = new Form1();
    f.Show();
    await GetTaskFromEvent(f, "FormClosed");
    //дальнейший код...
}
READ ALSO
Объявление матриц в MathNet.Numeric

Объявление матриц в MathNet.Numeric

Нужно объявить две матрицы: 1х3 и 3х2 с конкретными значениями, а затем перемножить эти две матрицы

190
Когда ручной вызов GC.Collect() оправдан?

Когда ручной вызов GC.Collect() оправдан?

Часто нахожу в коде вызовы GCCollect(), например при работе с графиков через GDI+

202
Не удается неявно преобразовать тип &ldquo;string&rdquo;

Не удается неявно преобразовать тип “string”

Был простенький запрос на извлечение списка по убыванию из базы с пагинацией на странице:

199
Как использовать InvokeRequired, BeginInvoke в классе?

Как использовать InvokeRequired, BeginInvoke в классе?

Сделал приложение, которое собирает данные репозитариев с githubcom

225