2017-08-02 49 views
2

これは私の最初の投稿ですので、私はverry明白な私の問題をabouになることを願っています。VB.NET非同期でTASKクラスを使用

現在、私はデータベースで作業していますが、一部のpoitでは、データがないためにレイテンシに問題があります。 私が望むのは、メインフォームのボタンを押して、別のフォームでコンボボックスに値を設定し、そのフォームを表示するメソッドをとる別々のタスクを呼び出すときです。ここで

はコードです:

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内のコンボボックスが空に戻ります!

私は何が分からないのですか?...私はおそらくあなたがメインフォーム内でタスクを使用することはできないと考えています。私はわからないんだけど...私は、Visual Studioに2012 ==テンプレートを使用しています

==:Visual Basicの

助けてください!

ありがとうございました!

+0

(https://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html)[あなたが今まで 'Task'コンストラクタを使用しないでください] 。 –

答えて

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.Factory.StartNew'(http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html)の代わりに 'Task.Run'を使う方が良いでしょう。 –

関連する問題