¿Cómo funciona con AsyncController en asp.net MVC 3?

Busca varios blogs al respecto pero siempre son los mismos ejemplos.

No sé si no lo entiendo o no sé el uso, pero no veo un proceso paralelo cuando trabajo con AsyncController.

Las siguientes pruebas realizadas

Crea un nuevo proyecto de tipo Asp.net MVC

HomeController.cs

public void IndexAsync()
{
    AsyncManager.OutstandingOperations.Increment();
    var bg = new BackgroundWorker();
    bg.DoWork += (o, e) => GetEntriesBlog();
    bg.RunWorkerCompleted += (o, e) =>
                                    {
                                        AsyncManager.Parameters["items"] = e.Result;
                                        AsyncManager.OutstandingOperations.Decrement();
                                    };
    bg.RunWorkerAsync();

    ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";

}

public ActionResult IndexCompleted(IEnumerable<SyndicationItem> items)
{
    return View(items);
}

[NonAction]
public IEnumerable<SyndicationItem> GetEntriesBlog(int page = 0)
{
    using (var reader = XmlReader.Create("http://blog.bindsolution.com/rss"))
    {
        Thread.Sleep(20000);
        var rssData = SyndicationFeed.Load(reader);
        if (rssData != null)
        {
            return (from item in rssData.Items
                    orderby item.PublishDate descending
                    select item).Take(3).Skip(3 * page).ToList();
        }
        return null;
    }
}

¡Retrase siempre 20 segundos navegando por el sitio!

Estaba pensando en usar PartialView AsyncController para realizar esta tarea. ¿Trabaja?

preguntado el 08 de noviembre de 11 a las 13:11

1 Respuestas

Creo que está malinterpretando lo que haría el trabajador en segundo plano asincrónico.

Si la operación toma 20 segundos, el uso de un trabajador en segundo plano no reducirá ese tiempo ni hará que la vista se renderice más rápido. El uso de operaciones asincrónicas liberar el proceso de trabajo en el servidor para procesar otras solicitudes mientras que esta solicitud de larga duración sigue avanzando.

En su caso, creo que debería crear una vista muy simple que regrese rápidamente al usuario y ejecute la operación de larga duración como una solicitud asíncrona. del cliente. Por ejemplo, renderice las partes rápidas de su página (por ejemplo, encabezado, menús, etc.) y realice una solicitud AJAX para las entradas del blog.

Dependiendo de la naturaleza del código en GetEntriesBlog, es posible que no necesite hacer que la operación del controlador sea asíncrona. En teoría, dado que la mayor parte del tiempo en este método se dedicará a esperar a que la solicitud HTTP GET http://blog.bindsolution.com/rss completar, que podría Sería una buena idea, pero en la práctica, esas cosas deben estar marcadas (y tal vez bajo una carga pesada) para asegurarse de que está obteniendo el beneficio que espera. Tenga en cuenta que el lado del código de su servidor será más complejo (y más difícil de mantener) si lo hace asincrónico. Le sugiero que siga esta ruta solo si obtiene un beneficio significativo.

respondido 08 nov., 11:23

Tienes razón, fue confuso. ¡Pero ahora comprenda la diferencia! No sé cómo resolver este caso porque uno de los requisitos es que el sitio funcione incluso con JavaScript desactivado. Pero este ya es otro hilo. ¡Gracias! - ridermansb

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.