Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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 - Fatal编程技术网

Vb.net 任务未关闭等待窗体

Vb.net 任务未关闭等待窗体,vb.net,Vb.net,我正在使用一些任务来执行一些操作,同时我向用户显示额外的“等待表单”,然后当任务的功能完成时,欢迎表单从任务关闭。我已经找到了解决方案,并在本主题中进行了讨论: 现在的问题是,我想在其他地方实施它,我面临的问题是,我的等待表仍然在那里(没有关闭),我不知道为什么。我能说的是,我检查了函数是否正在检索值——这是肯定的。我想这是因为函数在欢迎窗体出现之前就已经完成了,所以它会叠加。。。有没有办法检查一下情况是否属实?这就是代码: Dim pic As New Waiting

我正在使用一些任务来执行一些操作,同时我向用户显示额外的“等待表单”,然后当任务的功能完成时,欢迎表单从任务关闭。我已经找到了解决方案,并在本主题中进行了讨论:

现在的问题是,我想在其他地方实施它,我面临的问题是,我的等待表仍然在那里(没有关闭),我不知道为什么。我能说的是,我检查了函数是否正在检索值——这是肯定的。我想这是因为函数在欢迎窗体出现之前就已经完成了,所以它会叠加。。。有没有办法检查一下情况是否属实?这就是代码:

 Dim pic As New Waiting

                Dim tsk As Task(Of Boolean) = Task.Factory.StartNew(Function()
                                                                        '--Run lenghty task
                                                                        '--Show the form
                                                                        pic.ShowDialog()
                                                                        Dim retValue As Boolean = THIS_UpdateTransport()
                                                                        '--Close form once done (on GUI thread)
                                                                        pic.Invoke(New Action(Sub() pic.Close()))
                                                                        Return retValue
                                                                    End Function)


                '--Show the form
                pic.ShowDialog()
                Task.WaitAll(tsk

)

下面是我的答案,我使用
.Show()
而不是
ShowDialog()
在长任务运行时阻塞主窗体:

  • 此\u UpdateTransport
    更改为
    此\u UpdateTransportAsync

       Private Function THIS_UpdateTransportAsync() As Task(Of Boolean)
            'Do some really important work
            Return Task.Factory.StartNew(Function()
                                                 Threading.Thread.Sleep(5000)
                                                 Return True
                                         End Function)
        End Function
    
  • 将调用任务的UI方法声明为
    async
    (在我的示例中单击按钮):


  • 因此,这对我和一些示例表单+控件有效。

    您可以将
    此\u UpdateTransport()
    更改为返回
    任务(布尔值)的异步函数
    在lambda表达式中等待它。@Alex B.你能告诉我如何正确操作吗?你真的需要将等待表单显示为模式对话框吗?就像您在链接的问题
    ShowDialog()
    中已经回答的那样,阻止当前线程直到其关闭。因此,您必须在执行长时间运行的任务后显示它。但这意味着您试图在窗体显示之前关闭它。如果您使用
    Show
    代替,您的问题可以很容易地解决。目的是我想阻止家长。如何使用async/await来实现这一点,您可以非常友好地展示。那么为什么在其他地方没有出现这个问题呢?这里的原因是什么?很抱歉,异步/等待方法没有改变ShowDialog问题的问题。没有看到您的工作代码,很难确定任何差异;)我将尝试给您一个示例,其中父级被阻止,但显示了waiting as表单。
    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pic As New Waiting()
        'Block Parent Form from all user interactions
        Me.Enabled = False         
        'Use Show() instead of ShowDialog() to avoid Thread blocking
        pic.Show(Me) 
    
        'Await the long running Task until its done
        Dim result As Boolean = Await THIS_UpdateTransportAsync()
    
        'Close Waiting window
        pic.Close()
        'Reactivating Parent Form and enable use interactions
        Me.Activate()
        Me.Enabled = True
    End Sub