Question

J'ai une application dans laquelle une action déclenche un certain nombre d'e-mails pour être envoyés. Le nombre d'e-mails est variable et peut être de 10 à 1000 par l'action .

Je ne veux pas que l'application hang , tandis que les e-mails sont envoyés (l'utilisateur ainsi ennuyeux) et voudraient les envoyer en arrière-plan.

Je n'ai pas utilisé Threads dans le passé afin que ce que j'ai besoin de votre aide. Souhaitez-vous créer des threads manuellement ou est-ce un bon cas d'utiliser un ThreadPool? Je veux que cette tâche soit faible priorité et utiliser le moins de ressources possibles parce que je ne me dérange pas, même si l'e-mail est de 1 heure de retard.

apprécie votre aide Marko

Était-ce utile?

La solution

Voici une autre suggestion va ... Si l'aide d'un DB `re, créer une tâche (c.-à-créer une table qui représente une tâche à accomplir) liées aux messages qui doivent être envoyés et de l'utilisation Quartz.NET ou similaire (vous pouvez créer un service Windows aussi) qui cherche des tâches incomplètes et les exécute (en les marquant comme fait dans le cas où ils sont exécutés avec succès).

Autres conseils

A vrai dire, fils de discussion dans ASP.NET n'est pas une bonne idée. Asp.net fait beaucoup de disposer des ressources lorsqu'une fin de la demande et les messages à l'utilisateur. Puisque vous ne voulez pas l'utilisateur d'attendre, vous tomberez dans ce scénario, où les objets ASP.NET vous pensez sont sûrs à utiliser, sont vraiment disposé.

Votre meilleure option est de créer un service externe (soit un service WCF en cours d'exécution dans IIS ou un service Windows qui dispose d'une interface WCF exposée) que la page .net peut appeler de manière asynchrone, et avoir cette exécution de la demande jusqu'à ce qu'elle se termine. Pas de se soucier de filetage, etc. Il fonctionne dans son propre processus et quand il l'a fait complète. Puisque vous ne se soucient pas de dire l'utilisateur qui est fait, vous ne serez pas à vous soucier de le communiquer en arrière. De cette façon, si vous avez besoin d'avoir une autre page utilisent la même interface de service, il est là à appeler.

Les pages de commencer avec 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

Comment commencer à utiliser WCF / WPF?

Donc, ma suggestion est d'utiliser ThreadPool. Il vous permettra de file d'attente tout au lieu d'exécuter chacun d'eux séparément, ce qui en fait utiliser moins de ressources, mais bien sûr, de prendre plus de temps à tout processus, mais comme vous l'avez dit, le temps est pas un problème.

Vous pouvez simplement utiliser la classe BackgroundWorker .

La page MSDN liée a un bel exemple avec des rapports d'avancement et la possibilité d'annuler l'opération.

Edit: Des rapports d'étape et d'annulation ne pourrait pas convenir dans une application Web, mais le BackgroundWorker gère tous les trucs sales avec la création d'un fil pour vous.

Edit2: Si vous voulez envoyer plusieurs mails en parallèle, vous pouvez regarder le Task Parallel Library .

Vous pouvez utiliser les tâches pour se reproduire hors du thread de travail pour traiter les e-mails.

Si cela martèle la CPU trop, vous pouvez créer un nouveau programmateur qui réduit la concurrence: 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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top