2017-08-02 50 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)。 –