TaskFactory.Startnew,当Long running Task正在处理时,UI挂起

时间:2013-06-11 10:40:27

标签: .net vb.net asynchronous task

我尝试使用带有LongRunning参数的TaskFactory(Framework 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)

1 个答案:

答案 0 :(得分:2)

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

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