Usando un trabajador de fondo en ASP.NET con AJAX

Tengo la necesidad de realizar una tarea en segundo plano que tenga una barra de progreso que muestre el porcentaje realizado y un botón de cancelación. Dejando de lado las tareas específicas, por ahora, solo quiero que funcione un ejemplo, así que solo tengo los tres controladores de eventos principales (DoWork, ProgressChanged y RunWorkerCompleted) y un bucle que incrementa el contador y duerme durante 50 ms en DoWork. Sin embargo, no se actualiza excepto por una vez al final.

En Windows Forms, uso un trabajador en segundo plano y funciona correctamente sin ningún problema. Me gustaría usar este mismo código. Sin embargo, he estado viendo cosas que dicen que ASP.NET debe usar AJAX para obtener la misma funcionalidad. Así que mis preguntas son:

1) ¿Realmente necesito AJAX para usar el trabajador de fondo?

2)En caso afirmativo¿Necesito AJAX? ¿Cuál es la forma más fácil y más simple que una persona que no sabe nada de AJAX podría hacer para que el trabajador de Antecedentes esté en funcionamiento en una página web de ASP.NET?

3)Si no, No necesito AJAX, ¿puede alguien indicarme una muestra de trabajo que no la use? Me interesa, incluso si utiliza algún otro método de subprocesamiento que los trabajadores de fondo.

Lo siento por la pregunta de varias partes! Si puede responder a uno u otro, sería muy apreciado. Realmente no me importa qué método termine usando mientras funcione.

Código de referencia de la página .cs:

 protected void bwProcess_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 { 
     lblProgress.Text = "Task Complete: " + e.Result;
 }

 protected void bwProcess_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
     lblProgress.Text = e.ProgressPercentage.ToString();
 }

 protected void bwProcess_DoWork(object sender, DoWorkEventArgs e)
 {
     for (int i = 0; i <= 100; i++)
     {
         if (bwProcess.CancellationPending)
         {
             lblProgress.Text = "Task Cancelled.";
             e.Cancel = true;
             return;
         }
         bwProcess.ReportProgress(i);
         Thread.Sleep(50);
     }
     e.Result = "100%";
}

protected void BWClick(object sender, EventArgs e)
{
    lblProgress.Text = "Firing Process...";
    bwProcess = new BackgroundWorker();
    bwProcess.WorkerReportsProgress = true;
    bwProcess.WorkerSupportsCancellation = true;
    bwProcess.DoWork += new DoWorkEventHandler(bwProcess_DoWork);
    bwProcess.ProgressChanged += new ProgressChangedEventHandler(bwProcess_ProgressChanged);
    bwProcess.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwProcess_RunWorkerCompleted);

    if (bwProcess != null)
    {
        bwProcess.RunWorkerAsync("StartAsynchronousProcess");
    }
}

Otras notas: Ingresé Async = "True" y EnableSessionState = "ReadOnly" en la página @.

¡Gracias por adelantado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta