2009-10-01 3 views
0

ASP.NET MVC 1 ne prend pas en charge les threads asynchrones générés à l'intérieur d'un contrôleur (mais il existe des composants dans l'assembly Futures et MVC 2 Preview, mais rien dans la version de production). Cependant, je veux envoyer mon email de manière asynchrone et j'explore actuellement les options pour le faire. Une fois l'option apparemment facile, au lieu d'envoyer l'e-mail de manière synchrone, il semble que la méthode de livraison soit de supprimer le répertoire au lieu de l'envoyer, et que le serveur SMTP prenne le courrier à son propre rythme.Les performances du stockage des e-mails dans le répertoire de collecte sont-elles similaires à celles de l'envoi asynchrone?

Les performances de l'utilisation du répertoire de dépôt sont-elles similaires à celles de l'envoi de courrier électronique asynchrone?

Répondre

0

SmtpClient a effectivement la méthode SendAsync qui peut être utilisée.


MISE À JOUR:

Après avoir analysé plus ce scénario, il semble que l'utilisation SmtpClient.SendAsync à l'intérieur d'un contrôleur synchrone lance l'exception suivante:

opérations asynchrones ne sont pas autorisés dans ce contexte. L'opération asynchrone d'une opération asynchrone doit avoir l'attribut asynchrone défini sur true et une opération asynchrone peut uniquement être démarré sur une page avant l'événement PreRenderComplete .

Pour contourner ce problème un fil manuel peut être donné naissance:

public ActionResult Index() 
{ 
    new Thread(() => 
    { 
     // TODO: Add exception handling here: 
     var client = new SmtpClient("host"); 
     client.Send("from", "to", "subject", "body"); 
    }).Start(); 

    return View(); 
} 
+0

Comme je l'ai dit dans ma question, je ne peux pas utiliser asynchrone envoyer parce que les contrôleurs ASP.NET MVC ne prennent pas en charge la reproduction de fil asynchrone (ce qui rend SendAsync inutilisable.) – Alex

+0

Avez-vous besoin d'attendre que le mail soit réellement envoyé pour rendre la page? J'ai proposé ceci parce que c'est un scénario commun pour une action fire-and-forget. –

+0

Non, je n'ai pas besoin d'attendre, et je ne veux pas attendre que l'email soit envoyé. Je suis juste lié par l'environnement ASP.NET MVC que je ne peux pas démarrer des opérations asynchrones à partir d'un contrôleur, donc j'essaie de trouver un moyen de contourner le problème d'être forcé à envoyer de manière synchrone, ou au moins obtenir des performances comparable à l'envoi asynchrone. – Alex

Questions connexes