Vb.net 线程和模态窗体窗口
Net代码 我有一个在线程中运行进程的程序,在该线程中,我需要一个非模态的弹出消息信息框。主进程位于线程中,因为它必须并行运行,用户可以同时多次启动此进程 我了解到模式消息框需要是一个自定义表单,也可以从线程运行,以不阻止程序继续。例如.Show()停止程序并等待用户输入。您必须通过线程使用.ShowDialog() 我的代码: 调用初始线程:Vb.net 线程和模态窗体窗口,vb.net,multithreading,modal-dialog,Vb.net,Multithreading,Modal Dialog,Net代码 我有一个在线程中运行进程的程序,在该线程中,我需要一个非模态的弹出消息信息框。主进程位于线程中,因为它必须并行运行,用户可以同时多次启动此进程 我了解到模式消息框需要是一个自定义表单,也可以从线程运行,以不阻止程序继续。例如.Show()停止程序并等待用户输入。您必须通过线程使用.ShowDialog() 我的代码: 调用初始线程: Public Event Report As EventHandler 'In a method Task.Run(Function(
Public Event Report As EventHandler
'In a method
Task.Run(Function() BackgroundThread())
Private Function BackgroundThread() As Task()
RaiseEvent Report(Me, New System.EventArgs)
End Function
在Report方法中,我有一段代码,然后调用表单窗口以弹出模式窗口:
Private mDiaplayMessageBox As NonModalPopUp
Private Sub DisplayMessageBox()
mDiaplayMessageBox = New NonModalPopUp()
Task.Run(Sub() mDiaplayMessageBox.ShowDialog())
End Sub
我遇到的问题是,当我完成报告方法时,我想关闭此弹出消息。但是当一次打开多个弹出窗口时,只有最后一个打开的窗口会关闭,程序会失去其他弹出窗口的句柄,它们不会关闭
要关闭模式窗体中的窗口,请执行以下代码
Public Sub CloseMe()
'This will grab the thread that this window is running on, solves Cross-Threading issue.
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf CloseMe))
Exit Sub
End If
Me.BackColor = Color.Red
Me.Close()
End Sub
第一次调用此代码时,它将命中Me.Invoke,然后关闭窗口。但是,在任何后续调用中,当它到达Me.invokererequired时,它将被设置为false,而不是调用Me.Invoke并转到Me.Close(),但它不会关闭窗口
我试图在获取句柄intptr值的地方做一些事情,但每当我看到这个值时,程序就会立即抛出一个跨线程异常
我只想关闭其他窗口,这似乎不是一项艰巨的任务,但我不知道我缺少了什么。实现目标的方法之一可能如下代码所示: 您可以创建一个自定义事件,将其用作“调用”,以侦听表单的关闭
Public Class Form1
Dim frm2 As Form2
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
frm2 = New Form2
Task.Run(Sub()
AddHandler CloseFrm2, Sub()
Dim CloseMe As Action = Sub()
frm2.Close()
frm2.Dispose()
End Sub
If frm2.InvokeRequired Then
frm2.Invoke(Sub() CloseMe())
Else
CloseMe()
End If
End Sub
frm2.ShowDialog()
End Sub)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
RaiseEventCloseFrm2()
End Sub
End Class
Module EventHelper
Public Event CloseFrm2()
Sub RaiseEventCloseFrm2()
RaiseEvent CloseFrm2()
End Sub
End Module