在VB.NET中使用TASK类异步

时间:2017-08-02 06:11:09

标签: .net vb.net visual-studio-2012 async-await

这是我在这里的第一篇文章,所以我希望对我的问题非常明确。

目前我正在使用数据库,而且在某些时候,由于数据不对,我在延迟方面遇到了一些问题。

我想要的是,当我按下MainForm中的一个按钮来调用单独的Task,它接受一个以另一种形式填充comboBox的方法,然后显示该表单。

以下是代码:

Private Sub PopulateCmb()
    For Each value As Integer In servRefrence.PopulateID_Masini
        Form_Insert.ComboBox1.Items.Add(value)
    Next
    <<This is taking 3-4 seconds>>
End Sub

Private Async Sub BtnInsert_Click(sender As Object, e As EventArgs) Handles BtnInsert.Click

    Dim task As Task = New Task(New Action(AddressOf PopulateCmb))
    task.Start()
    LblInfo.Text = "Please Wait"
    Await task

    LblInfo.Text = "Idle"
    Form_Insert.Show()

End Sub

此方法:servRefrence.PopulateID_Masini返回来自网络服务器的整数列表......

此代码的问题在于,当任务完成时,Form_Insert中的组合框将返回空白!

我缺少什么?...我想也许是因为你不能在mainForm中使用任务(例如),并尝试修改&#34;第二种形式的一些数据......但我不确定......

==我使用的是Visual Studio 2012 == Template:Visual Basic

请帮忙!

谢谢!!!

1 个答案:

答案 0 :(得分:2)

问题是你在非UI线程中填充comboBox。我猜这个延迟是由服务调用引起的,所以你应该在UI线程中的任务等待之后填充组合框。

Dim task = Task.Factory.StartNew(Of List(Of Integer))(
           Function() As List(Of Integer)
                 Return servRefrence.PopulateID_Masini
           End Function)

Dim result = Await task

For Each value As Integer In result
    Form_Insert.ComboBox1.Items.Add(value)
Next