Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 线程和模态窗体窗口_Vb.net_Multithreading_Modal Dialog - Fatal编程技术网

Vb.net 线程和模态窗体窗口

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(

Net代码

我有一个在线程中运行进程的程序,在该线程中,我需要一个非模态的弹出消息信息框。主进程位于线程中,因为它必须并行运行,用户可以同时多次启动此进程

我了解到模式消息框需要是一个自定义表单,也可以从线程运行,以不阻止程序继续。例如.Show()停止程序并等待用户输入。您必须通过线程使用.ShowDialog()

我的代码:

调用初始线程:

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