Continuación de tareas bloqueando el hilo de UI

Estoy escribiendo un ciclo continuo de sondeo para ver si ocurren algunos eventos y luego tomar alguna medida sobre el hilo de UI.

Estoy escribiendo el siguiente código

public static void HandlePopup(this HostedControl control, string className, string caption, System.Action callback)
    {
        var popupTask = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000);//just wait for 5 seconds.
        }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).ContinueWith((prevTask) =>
        {
            AutomationElementCollection collection = null;
            do
            {

            } while (true);
        }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((prevTask) =>
        {
            if (!prevTask.IsFaulted)
            {
                if (control.InvokeRequired)
                {
                    control.Invoke(callback);
                }
                else 
                {
                    callback();
                }
            }
        }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

        try
        {
            ////popupTask.Wait();
        }
        catch (AggregateException ex)
        {
            ex.Handle(exnew =>
            {
                return true;
            });
        }
    }

El ciclo do while no tiene ningún código ahora, porque quiero probar que si ejecuto un ciclo infinitamente, la UI no se bloquea, sin embargo, no está funcionando como se esperaba y cuando el código ejecuta este ciclo (que nunca volverá) la interfaz de usuario se congela y deja de responder hasta que rompo la carrera.

¿Qué debo hacer para que se ejecute silenciosamente en segundo plano?

Nota: el elemento primario desde el que se llama este método es un evento de control del navegador web s documentcompelte`. El control del navegador web está dentro de la aplicación de formularios de Windows.

0
gracias, mi mal :(
agregado el autor shashank, fuente
He editado tu título. Consulte " ¿Las preguntas deben incluir" etiquetas "en sus títulos? ", donde el consenso es "no, deben hacerlo". no".
agregado el autor John Saunders, fuente

1 Respuestas

Estás explícitamente diciendo a la continuación que se ejecute en el contexto de sincronización actual especificando

TaskScheduler.FromCurrentSynchronizationContext()

Así que sí, eso bloqueará el hilo de la interfaz de usuario porque se ejecuta en el hilo de la interfaz de usuario suponiendo que se llama a este método general en un hilo de interfaz de usuario. La tarea original se ejecutará en segundo plano, pero las dos versiones están programadas para ejecutarse en el subproceso de la interfaz de usuario. Si no quiere hacer eso, no use ese planificador de tareas.

0
agregado
¿Ya sabes? He estado luchando con este código durante una hora ahora solo para darme cuenta de que estaba cometiendo un error tan estúpido :). Gracias una tonelada :)
agregado el autor shashank, fuente