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

如何在非模态窗口(Form.Show())下实现代码执行暂停?

解决方案:非模态窗体下的主程序状态控制与感知

方案一:用异步/await模拟ShowDialog的暂停效果

这是最贴合你需求的方案——既保留非模态窗体的交互性,又能让主程序代码在窗体关闭前暂停执行,无需大量重构原有逻辑。

实现步骤:

  1. 在C# DLL中封装一个异步方法,替代直接调用Form.Show():
public static async Task ShowNonModalBrowserAsync()
{
    var tcs = new TaskCompletionSource<bool>();
    var browserForm = new YourBrowserForm();
    
    browserForm.FormClosed += (sender, e) =>
    {
        tcs.SetResult(true);
        // 原有的数据库消息发送逻辑放在此处
    };
    
    browserForm.Show();
    await tcs.Task;
}
  1. 在VB.NET主程序中调用该异步方法,前后控制功能的禁用/启用:
' 禁用主程序部分功能
DisableMainAppFeatures()

' 代码会在此处暂停,直到浏览器窗体关闭,逻辑和ShowDialog()一致
Await YourCSharpDllClass.ShowNonModalBrowserAsync()

' 窗体关闭后恢复主程序功能
EnableMainAppFeatures()

方案二:通过事件回调让主程序感知窗体关闭

如果不想使用异步模式,可以让C#的窗体暴露自定义关闭事件,主程序订阅后处理状态恢复:

实现步骤:

  1. 在C#的浏览器窗体类中添加自定义关闭事件:
public class YourBrowserForm : Form
{
    // 定义自定义关闭事件
    public event EventHandler OnFormClosedEx;

    protected override void OnFormClosed(FormClosedEventArgs e)
    {
        base.OnFormClosed(e);
        // 触发自定义事件通知主程序
        OnFormClosedEx?.Invoke(this, EventArgs.Empty);
        // 原有的数据库消息发送逻辑
    }
}
  1. 在C# DLL的对外方法中返回窗体实例:
public static YourBrowserForm ShowNonModalBrowser()
{
    var browserForm = new YourBrowserForm();
    browserForm.Show();
    return browserForm;
}
  1. VB.NET主程序中订阅事件并控制功能状态:
' 禁用主程序部分功能
DisableMainAppFeatures()

Dim browserForm = YourCSharpDllClass.ShowNonModalBrowser()
' 订阅窗体关闭事件
AddHandler browserForm.OnFormClosedEx, Sub(sender, e)
    ' 恢复主程序功能
    EnableMainAppFeatures()
End Sub

方案三:弱引用+定时检查(仅适用于无法修改C# DLL的场景)

如果不能修改C# DLL代码,主程序可以保留窗体的弱引用,通过定时器定期检查窗体状态:

Dim browserForm As Form = YourCSharpDllClass.GetBrowserForm() ' 假设DLL提供返回窗体的方法
Dim timer As New Timer() With {.Interval = 500}

DisableMainAppFeatures()
browserForm.Show()

AddHandler timer.Tick, Sub(sender, e)
    If browserForm Is Nothing OrElse browserForm.IsDisposed Then
        timer.Stop()
        EnableMainAppFeatures()
    End If
End Sub

timer.Start()

这种方式不够优雅且有性能开销,仅作为临时替代方案。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:03:12