在等待任务完成时更新UI

时间:2015-10-26 17:19:36

标签: vb.net .net-4.0 task

我有一个处理大量数据的vb.net应用程序。由于流程的内存需求,我这样做是按批次进行的,整体计划结构如下:

CGPoint *points = malloc(sizeof(CGPoint) * mutableArrayOfPoints.count);
for (int i = 0; i < mutableArrayOfPoints.count; i++) {
    points[i] = [mutableArrayOfPoints[i] pointValue];
}

正确的方法是什么:

  1. 等待所有任务完成后再转移到下一批?
  2. 在每项任务完成后,使用整体进度更新UI?
  3. 我的目标框架是.NET 4.0。

    我感谢任何意见。

    编辑:目前我正在使用Do while Start < TotalNumberOfObjects [cache data used for the upcoming batch] For i = Start to Stop [process data using multiple tasks...for example:] t=taskfactory.startnew(doStuff(i)) TaskList.TryAdd(t.ContinueWith(Sub() Me.BeginInvoke(DelegateUpdateProgress, {progress}) End Sub)) Next [Wait for tasks to complete... Normally I would wait for the tasks using task.waitall(), but this will cause the UI to wait to update until all tasks are complete] Start = Stop+1 Stop = Stop+Increment [clear data from batch that was just completed] loop 完成每项任务后更新用户界面并调用task.continuewith()来更新表单,

    me.beginInvoke

    但是,这与我期望等待完成任务列表TaskList.TryAdd(t.ContinueWith(Sub() Me.BeginInvoke(DelegateUpdateProgress, {progress}) End Sub)) 的方式不兼容,因为调用task.waitall(tasklist)将导致UI线程等待更新,直到所有任务完成

2 个答案:

答案 0 :(得分:0)

为什么不把你的例程放在Backgroundworker结构中?

因此,在编写流程数据时,您已准备好更新您拥有的任何UI组件。

如有必要,您也可以从Backgroundworker更新UI,但是您需要有一些特殊要求才能执行此操作。

您可以在这里咨询: https://msdn.microsoft.com/en-us//library/ywkkz4s1.aspx

答案 1 :(得分:0)

首先,您需要设置委托,然后使用Dispatcher.Invoke

在下面的示例中,按钮从启用更改为禁用(或反之):

   Delegate Sub SetRecordButtonEnabledCallback(ByVal Enabled As Boolean)
   Friend Sub SetRecordButtonEnabled(ByVal Enabled As Boolean)
        Me.btnDGRecord.IsEnabled = Enabled
   End Sub

之后你需要做的就是从你的计时器中调用以下代码来调用它:

  

Dim DesiredValue as Boolean = True

     

Me.Dispatcher.Invoke(New SetRecordButtonEnabledCallback(AddressOf SetRecordButtonEnabled),New   Object(){DesiredValue})