2017-08-02 4 views
2

Dies ist mein erster Beitrag hier, also hoffe ich, sehr explizit über mein Problem zu sein.Verwendung der TASK-Klasse in VB.NET async

Derzeit arbeite ich mit einer Datenbank, und an einigen Punkten habe ich einige Probleme mit der Latenz aufgrund der Daten amont. Was ich will, ist, wenn ich eine Taste in der MainForm drücken, um separate Task, die eine Methode, die ein ComboBox in einem anderen Formular auffüllt, und zeigen Sie dann dieses Formular aufrufen. Hier

ist der Code:

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 

Diese Methode: servRefrence.PopulateID_Masini eine Liste von ganzen Zahlen zurückgibt, die vom Webserver kommt ...

Das Problem mit diesem Code ist, dass, wenn die Aufgabe ist fertig, die Combobox innerhalb der Form_Insert kommt leer zurück!

Was vermisse ich ?? ... Ich denke, vielleicht weil Sie eine Aufgabe innerhalb der MainForm (z. B.) nicht verwenden können, und versuchen, einige Daten in einer zweiten Form zu ändern ... aber ich bin nicht sicher ...

== ich Visual Studio 2012 == Vorlage verwenden: Visual Basic

Bitte um Hilfe!

Danke !!!

+0

[Sie sollten nicht immer verwenden, um die 'Task' Konstruktor] (https://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) . –

Antwort

2

Problem ist, dass Sie die ComboBox in Nicht-UI-Thread bevölkern. Ich nehme an, dass die Wartezeit durch einen Serviceaufruf verursacht wird. Daher sollten Sie die Combobox füllen, nachdem die Aufgabe im UI-Thread wartet.

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

Ja. Es wäre sogar besser, [Task.Run' anstelle von 'Task.Factory.StartNew' zu verwenden (http://blog.stephencleary.com/2013/08/startnew-dangerous.html). –

Verwandte Themen