我有一个处理大量数据的vb.net应用程序。由于流程的内存需求,我这样做是按批次进行的,整体计划结构如下:
CGPoint *points = malloc(sizeof(CGPoint) * mutableArrayOfPoints.count);
for (int i = 0; i < mutableArrayOfPoints.count; i++) {
points[i] = [mutableArrayOfPoints[i] pointValue];
}
正确的方法是什么:
我的目标框架是.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线程等待更新,直到所有任务完成
答案 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})