MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как дождаться закрытия формы?"
Answer 894129
Как-то так (.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"); //дальнейший код... }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.