1

我正在尝试使用具有 LongRunning 参数的 TaskFactory(框架 4)运行异步任务,我显示了一个加载面板,但 ui 挂起并且动态 gif 未正确呈现。

我认为在显示面板后触发此任务将在单独的线程中完成,因此 UI 可以自由显示我的加载图像,但它会卡住。

任务启动后没有更多代码。其他一切都在回调函数中控制。

如何执行此加载图像以显示不挂起?

'HERE I MAKE VISIBLE MY LOADING PANEL
panelCargando.Visible = True

'I START A LONG RUNNING TASK with callback
Dim context As TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext

        Task(Of ContratoType). _
            Factory.StartNew(Function()

                                 Dim contrato As ResultadoTarificacionType = Me.Tarificador.TarificarContrato(datosContrato, Nothing, 25000)

                                 Dim estadoContacto As EstadoProductoContratoType() = Tarificador.ObtenerEstadosTarificacion(contrato.IdContrato)

                                 'Dim estadoProductoTarif As EstadoProductoContratoType() = Tarificador.ObtenerEstadosTarificacionProductos(contrato.IdContrato )
                                 Return Tarificador.ObtenerContrato(contrato.IdContrato)

                             End Function, CancellationToken.None, TaskCreationOptions.LongRunning, context) _
        .ContinueWith(Sub(r)
                          TaskCallBack(r)
                      End Sub, context)
4

1 回答 1

2

您明确使用TaskScheduler.FromCurrentSynchronizationContext. 这意味着你的长时间运行的任务将在 UI 线程上运行——你告诉它的!

我怀疑你真正想要的是对长时间运行的任务使用默认的任务调度程序,但传递TaskScheduler.FromCurrentSynchronizationContext给你的ContinueWith调用,以便只在 UI 线程上执行回调。

于 2013-06-11T10:54:13.363 回答