task.run中的异步更新列表框

时间:2014-09-03 12:58:04

标签: .net vb.net asynchronous

我正在制作一个程序,用于检查数据集中是否存在数据问题,如果找到了某些内容,则需要将问题写入列表框。 由于这是一个非常漫长的过程,我使用异步和等待关键字,以便用户可以继续使用其他Windows。

在按钮处理程序中,我编写了以下代码:

Private Async Sub BtnIniciar_Click(sender As Object, e As EventArgs) Handles BtnIniciar.Click
 (...)
Await ValidaFracoesRepetidas()
 (...)
End Sub

在子程序中,我正在尝试执行以下操作:

Private Async Function ValidaFracoesRepetidas() As Task
        Await Task.Run(Sub()
         (...)
         ListProblems.Items.Add("the building " & edf.EdificioId & " has repeated rooms " &    frac(i) & " in floor " & patual)
         (...)
         End Sub)
End Function

但是一旦它到达ListProblems.Items.Add,该程序就会抛出异常。 我想知道是否有办法从另一个线程写入UI中的列表框。如果没有,我可以返回一个Task(Of List(Of String))然后在ui线程中将值写入ListBox并使用For Each吗?

注意:ListProblems是ui(windows窗体)中列表框的名称,如果您需要我显示更多代码,请询问,我会给你更多。

非常感谢您的关注和抱歉,因为我是多线程的初学者,

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

尝试这样的事情(我是C#dev):

Private Async Function ValidaFracoesRepetidas() As Task
    Await Task.Run(Sub()
      (...)
      End Sub)
    ListProblems.Items.Add(...)
    Await Task.Run(Sub()
      (...)
      End Sub)
End Function