如何在非模态窗口(Form.Show())下实现代码执行暂停?
解决方案:非模态窗体下的主程序状态控制与感知
方案一:用异步/await模拟ShowDialog的暂停效果
这是最贴合你需求的方案——既保留非模态窗体的交互性,又能让主程序代码在窗体关闭前暂停执行,无需大量重构原有逻辑。
实现步骤:
- 在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; }
- 在VB.NET主程序中调用该异步方法,前后控制功能的禁用/启用:
' 禁用主程序部分功能 DisableMainAppFeatures() ' 代码会在此处暂停,直到浏览器窗体关闭,逻辑和ShowDialog()一致 Await YourCSharpDllClass.ShowNonModalBrowserAsync() ' 窗体关闭后恢复主程序功能 EnableMainAppFeatures()
方案二:通过事件回调让主程序感知窗体关闭
如果不想使用异步模式,可以让C#的窗体暴露自定义关闭事件,主程序订阅后处理状态恢复:
实现步骤:
- 在C#的浏览器窗体类中添加自定义关闭事件:
public class YourBrowserForm : Form { // 定义自定义关闭事件 public event EventHandler OnFormClosedEx; protected override void OnFormClosed(FormClosedEventArgs e) { base.OnFormClosed(e); // 触发自定义事件通知主程序 OnFormClosedEx?.Invoke(this, EventArgs.Empty); // 原有的数据库消息发送逻辑 } }
- 在C# DLL的对外方法中返回窗体实例:
public static YourBrowserForm ShowNonModalBrowser() { var browserForm = new YourBrowserForm(); browserForm.Show(); return browserForm; }
- 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
相关产品推荐
相关产品推荐

