Pregunta

Tengo una aplicación en la que una acción desencadena una serie de correos electrónicos para enviarlos. El número de mensajes de correo electrónico es variable y puede estar en cualquier lugar del 10 al 1000 por la acción .

No quiero que la aplicación de hang , mientras que los correos electrónicos se envían (por lo tanto molesta al usuario) y desea enviar en el fondo.

No he utilizado Hilos en el pasado y por eso necesito su ayuda. ¿Le crear hilos de forma manual o se trata de un caso bueno utilizar una ThreadPool? Quiero que esta tarea sea baja prioridad y utilizar la menor cantidad de recursos posibles, ya no me importa, incluso si el correo electrónico es de 1 hora de retraso.

Apreciamos su ayuda
Marko

¿Fue útil?

Solución

Aquí va otra sugerencia ... Si tu eres el uso de un DB, crear una tarea (es decir, crear una tabla que representa una tarea a realizar) relacionado con los mensajes que necesitan ser enviados y el uso Quartz.NET o similar (es posible crear un servicio de Windows también) que busca tareas incompletas y ejecuta ellos (marcándolos como se ha hecho en el caso de que se ejecuten con éxito).

Otros consejos

A decir verdad, con hilo en ASP.NET no es una buena idea. Asp.net hace un montón de disponer de los recursos cuando una solicitud extremos y mensajes de vuelta al usuario. Dado que usted no desea que el usuario espere, se encontrará con este escenario, donde los objetos ASP.NET cree que son seguros de usar, son realmente eliminado.

Su mejor opción es crear un servicio externo (ya sea un servicio WCF se ejecuta en IIS, o un servicio de Windows que tiene una interfaz WCF expuesta), que la página .NET pueden llamar de forma asíncrona, y tener esa petición de ejecución hasta que se complete. No se preocupan de rosca etc. Se ejecuta en su propio proceso y cuando se hace que se complete. Ya que no se preocupan por que indica al usuario que se hace, usted no tendrá que preocuparse de que la comunicación posterior. Esta manera de, si es necesario tener algún otro uso página de la misma interfaz de servicio, que está ahí para ser llamado.

Páginas sobre cómo empezar a WCF:

http://bloggingabout.net /blogs/dennis/archive/2007/04/20/wcf-simple-example.aspx

http://msdn.microsoft.com/en-us/library /bb332338.aspx

http://www.c-sharpcorner.com /Articles/ArticleListing.aspx?SectionID=1&SubSectionID=192

cómo empezar a usar WCF / WPF?

Así que mi sugerencia es usar ThreadPool. Sería permite poner en cola todo en su lugar para ejecutar cada uno de ellos por separado, por lo que es usar menos recursos, pero, por supuesto, teniendo más en proceso de todo, pero como usted ha dicho, el tiempo no es un problema.

Se podría simplemente utilizar el href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx" rel="nofollow"> BackgroundWorker clase

La página vinculada MSDN tiene un buen ejemplo, con la presentación de informes progreso y la posibilidad de cancelar la operación.

Editar
Los informes de progreso y cancelación podría no ser adecuado en una aplicación web, pero el BackgroundWorker maneja todas las cosas sucias con la creación de un hilo para usted.

Edit2:
Si desea enviar muchos correos en paralelo se puede ver el tarea paralela Biblioteca .

Se podría utilizar Tareas para desovar fuera el subproceso de trabajo para procesar los mensajes de correo electrónico.

Si esto está martillando la CPU demasiado, se puede crear un nuevo planificador que reduce la concurrencia: http://msdn.microsoft.com/en-us/library/ee789351.aspx

static void StartMailTasks(string[] addresses)
{
    List<Task> tasks = new List<Task>();
    foreach (var address in addresses)
    {
        tasks.Add(Task.Factory.StartNew(Email, address));
    }

    Task.Factory.ContinueWhenAll(tasks.ToArray(), AllDone, TaskContinuationOptions.OnlyOnRanToCompletion);
    Task.Factory.ContinueWhenAny(tasks.ToArray(), ReportError, TaskContinuationOptions.OnlyOnFaulted);
}

static void AllDone(Task[] tasks)
{
    // All is well
}

static void ReportError(Task errorTask)
{
    // Log or report the error
}

static void Email(object state )
{
    // send the e-mail  
    // Can throw error, if needed
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top