我尝试使用带有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)
答案 0 :(得分:2)
您明确使用TaskScheduler.FromCurrentSynchronizationContext
。这意味着你的长期运行任务将在UI线程上运行 - 你告诉它!
我怀疑你真正想要的是为长时间运行的任务使用默认任务调度程序,但是将TaskScheduler.FromCurrentSynchronizationContext
传递给你的ContinueWith
调用,以便只在UI线程上执行回调