2008-09-25 6 views
4

J'ai une fonction simple qui envoie des courriels, comment pourrais-je utiliser les threads pour accélérer la livraison des courriels?Filetage lors de l'envoi de courriels

Un exemple de code serait idéal.

+0

une solution finale avec le code source complet? – Kiquenet

Répondre

8

Utilisez SendAsync isntead.

+1

Vous pouvez toujours envoyer seulement 1 asynchrone. email à la fois par client Smtp (il ne vous laissera pas l'appeler si un autre est encore en cours). Cette route n'est donc pas très utile lors de l'envoi de gros lots d'e-mails à partir d'un client. Et si vous dites alors utiliser plusieurs clients, alors async n'accélère vraiment le taux qu'à vous pouvez créer les clients et leur dire d'envoyer ... Meilleure option: Création de threads, création d'un client pour chacun, et utilisation régulière Envoyer(). Au moins dans mes tests, l'enfilage finit par être l'option la plus rapide, bien sûr cela dépend aussi du matériel. –

1

Créez votre classe avec une méthode vide statique qui fera démarrer votre classe en train de faire ce que vous voulez faire sur le thread séparé avec quelque chose comme:

using System; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     Thread newThread = new Thread(new ThreadStart(Work.DoWork)); 
     newThread.Start(); 
    } 
} 

class Work 
{ 
    Work() {} 
    public static void DoWork() {} 
} 

Une autre alternative est d'utiliser la classe ThreadPool si vous ne vouloir gérer vous-même vos fils.

Plus d'info sur les sujets - http://msdn.microsoft.com/en-us/library/xx3ezzs2.aspx

Plus d'info sur ThreadPool - http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx

1

Avoir un fil séparé ne sera pas accélérer la livraison de courrier électronique cependant. Tout ce qu'il va faire est de retourner le contrôle à la méthode d'appel plus rapidement. Donc, à moins que vous ayez besoin de le faire, je ne voudrais même pas le déranger.

+0

Si vous envoyez plusieurs e-mails, vous ne voulez pas laisser l'utilisateur attendre longtemps. – JohnnyBizzle

-1

Vous savez que ce serait plus simple et plus simple de créer un backend d'application et d'envoyer des emails toutes les 30 minutes. Lancez les informations dans une base de données que vous devez envoyer vers et depuis, créez un pool d'applications qui se lance toutes les 30 minutes. Quand il se lance, vous pouvez envoyer un email. Pas besoin d'attendre que votre gestionnaire d'événements envoie l'e-mail ...

Cela fonctionne pour nous. Je pensais que ça aiderait pour toi.

2

Vous pouvez exécuter la fonction dans un autre thread. Étant SendMail votre courrier fonction de l'expéditeur, vous pouvez:

ThreadPool.QueueUserWorkItem(delegate { SendMail(message); }); 
1

Lorsque vous envoyez des e-mails à l'aide de plusieurs threads, faire attention à s'identifié comme spam par votre fournisseur d'accès Internet. Il vaudra mieux opter pour des lots plus petits avec un certain retard entre chaque lot.

2

IN 4.0, vous pouvez utiliser ce qui suit,

new Thread(x => SendMail(message)).Start(); 

et

public static void SendEmail(MailMessage message) 
{ 
    using (SmtpClient client = new SmtpClient("smtp.XXXXXX.com")) 
    { 
     client.Send(message); 
    } 
} 
Questions connexes