【问题标题】:Use Tasks/Multi-Thread to load data and show UI使用 Tasks/Multi-Thread 加载数据并显示 UI
【发布时间】:2015-02-18 20:37:15
【问题描述】:

所以我在玩多线程。我有一个特定的表单,它在从文件加载数据时需要一段时间才能弹出。我的想法是在后台加载数据,但仍显示表单并在表单上显示正在加载其他数据的消息。

我已经完成了所有工作,除了我不确定如何通知线程已完成并准备将数据作为字典传递给我。

据我所知:P

Dim t1 As Task(Of Dictionary(Of String, Double()))

Private Sub cbchannels_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbchannels.SelectedIndexChanged
    t1 = Task(Of Dictionary(Of String, Double())).Factory.StartNew(Function() Load_Data())
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    If t1.IsCompleted Then
        data = t1.Result
    End If
End Sub

我知道任务有能力检查它是否完成并得到结果

 t1.IsCompleted
 t1.Result

是使用计时器不断检查任务是否完成的唯一方法吗? 我所做的有意义吗? 我不想使用 BackgroundWorker。

【问题讨论】:

    标签: vb.net multithreading task


    【解决方案1】:

    那个计时器很聪明。还好有一个直接被通知。您可以在任何Task 上调用ContinueWith 以注册在该任务完成时调用的回调。这回答了您的问题。

    相反,您应该研究异步和等待。使用 C# 5 在 UI 应用程序中运行后台工作变得更加容易。

    【讨论】:

    • 但是我如何注册回调呢?我无法让它工作。任何使用 await 的尝试都会导致程序在该点等待
    • .ConfigureAwait(false);否则你可能会遇到死锁......你可能想阅读一些关于 UI 的异步等待模式
    • 发布您拥有的当前代码。没有它就无法诊断。
    • 这就是我所拥有的一切。 t2 = Task(Of Double()).Factory.StartNew(Function() GetData()) 我不确定将其他代码放在哪里。我现在正在使用计时器,但一旦我想出其他方法就会替换它
    • 在该任务上调用 ContinueWith。
    【解决方案2】:

    虽然这不是唯一的方法,但最简单的选择可能是使用BackgroundWorker。您调用RunWorkerAsync 将其关闭并在DoWork 事件处理程序中完成工作。完成后,将数据分配给e.Result 属性。然后,您可以在 RunWorkerCompleted 事件处理程序中的 UI 线程上将其取回。例如

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        BackgroundWorker1.RunWorkerAsync()
    End Sub
    
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim table As DataTable = GetData()
    
        e.Result = table
    End Sub
    
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Dim table = DirectCast(e.Result, DataTable)
    
        'Use table here.
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2015-05-07
      相关资源
      最近更新 更多