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
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