2013-10-04 2 views
8

ho avuto il seguente per le email, che ha lavorato:Un modulo asincrono o gestore completato durante un'operazione asincrona era ancora in corso

private SmtpClient _client = new SmtpClient("smtp.gmail.com", 587) 
    { 
     Credentials = new NetworkCredential("[email protected]", "password"), 
     EnableSsl = true 
    }; 
    public void DoThis(){ 
    _client.Send("[email protected]", to.Email, "Subject", "Body");} 
    public void DoThat(){ 
    _client.Send("[email protected]", to.Email, "Subject", "Body");} 

Ma stava bloccando l'applicazione web fino a quando l'email è stata inviata, così ho deciso di provare a inviare in modo asincrono:

public void DoThis(){ 
    var message = new MailMessage("[email protected]", to.Email, "Subject", "Body"); 
    _client.SendAsync(message, null); 
    } 

che posso vedere sempre trattati in modo asincrono se metto a punto, ma ho sempre il seguente:

An asynchronous module or handler completed while an asynchronous operation was still pending.

Cosa sto sbagliando?

+0

Asincronia non modifica nulla del fatto che i processi a esecuzione prolungata non devono essere gestiti all'interno di IIS. Dovresti lanciarlo in una tabella delle attività e lasciare che un'attività ricorrente programmata o un servizio Windows lo raccolga. –

+0

@RobVious Sto affrontando lo stesso problema. Sei riuscito a risolverlo? – Bitsian

+0

@Bitsian sì, vedere la mia risposta sotto – RobVious

risposta

5

ho finito per rielaborare il modo in cui la mia email asincrono viene inviato con il seguente:

public void SendAsyncEmail(MailMessage message) 
     { 

      var client = new SmtpClient("mail.hover.com", 587) 
      { 
       Credentials = new NetworkCredential("[email protected]", "Covert00!"), 
       EnableSsl = false 
      }; 
      client.SendCompleted += (sender, error) => 
      { 
       if (error.Error != null) 
       { 
        // TODO: get this working 
        throw new WarningException("Email Failed to send."); 
       } 
       client.Dispose(); 
       message.Dispose(); 
      }; 
      ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message))); 
     } 

Si noti che questa è una soluzione temporanea, e che il modo corretto (sembra) per gestire email è quello di utilizzare un po ' tipo di queue service abbinato a un ruolo di lavoratore oa un altro servizio di Windows per far apparire i messaggi.

+0

Controllare questo fuori - il modo corretto per farlo: http://www.aspsnippets.com/Articles/How-to-send-email-Asynchronously-in-ASPNet-using-Background -Thread.aspx – niico

+0

Quando provo questo approccio, ottengo questo errore: Impossibile accedere a un oggetto disposto. Nome oggetto: 'System.Net.Mail.SmtpClient'. – thomas