2017-08-02 48 views
2

这是我在这里的第一篇文章,所以我希望能够成为安博我的问题柠明确。使用Task类在VB.NET异步

我目前使用数据库,并在一些八邑,我遇到由于数据的入账金额一些问题的延迟。 我想要的是,当我按MainForm中的按钮来调用单独的任务,需要一种方法填充另一种形式的组合框,然后显示该窗体。

下面是代码:

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返回了来自Web服务器的整数列表...

这段代码的问题是,当任务完成后,Form_Insert内的组合框返回空!

我缺少什么?......我想也许是因为你不能使用一个任务的MainForm内(前),并尝试在第二个形式“修改”一些数据......但我不知道......

==我使用Visual Studio 2012 ==模板:Visual Basic中

请帮帮忙!

谢谢!!!

+0

[你不应该永远使用'Task'构造(https://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) 。 –

回答

2

问题是,你是在填充非UI线程的组合框。我猜这个延迟是由服务调用引起的,所以你应该在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 
+1

是的。这会更好[使用'Task.Run'而不是'Task.Factory.StartNew'](http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html)。 –