You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:06:03