Modal与Non-Modal窗体配合using语句的使用差异及实现咨询
问题原因
Show() 是非模态调用方法,执行后不会阻塞当前线程,原代码执行Show()后会立刻执行后续逻辑,随后using块结束自动触发窗口的Dispose释放,窗口刚显示就被销毁,自然无法正常运行。而ShowDialog()是模态阻塞方法,会等待窗口关闭后才执行后续代码,因此原有逻辑可以正常运行。
适配方案
只需在Show()之后增加等待窗口关闭的逻辑,阻塞后续代码执行直到用户完成窗口操作,即可完全对齐原有ShowDialog()的行为,同时保留Show()模式下OnDeactivated事件可正常触发的特性。以下是完整实现代码:
Dictionary<string, string> input; using (var window = new Form1()) { window.Show(); // UI线程调用场景下的等待逻辑,保证消息正常分发 while (!window.IsDisposed && window.Visible) { Application.DoEvents(); Thread.Sleep(10); } if (window.DialogResult == DialogResult.Cancel) { return Result.Cancelled; } input = window.GetInformation(); }
如果你的调用逻辑在后台非UI线程,可以使用更轻量的等待方案:
Dictionary<string, string> input; using (var window = new Form1()) { using var closeSignal = new ManualResetEventSlim(false); window.FormClosed += (sender, e) => closeSignal.Set(); window.Show(); closeSignal.Wait(); if (window.DialogResult == DialogResult.Cancel) { return Result.Cancelled; } input = window.GetInformation(); }
注意事项
- 保持Form1内部按钮逻辑不变:确认/取消按钮点击后需要给
DialogResult赋值并调用Close()方法关闭窗口 - 两种方案都完全保留了using的自动资源释放逻辑,窗口使用完成后会自动销毁,和原有模态调用的行为完全一致
内容的提问来源于stack exchange,提问作者Jens Slofstra
相关产品推荐
相关产品推荐

