2013-10-04 15 views
8

miałem następujące dla poczty elektronicznej, który pracował:asynchroniczny moduł lub obsługi zakończono natomiast operacja asynchroniczna została jeszcze w toku

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");} 

Ale to było blokowanie aplikacji internetowych aż email został wysłany, więc postanowiłem spróbuj wysłać asynchronicznie:

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

Który widzę coraz traktowane asynchronicznie jeśli debugować, ale zawsze pojawia się następujący:

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

Co robię źle?

+0

Asynchrony nie zmieniają faktu, że długotrwałe procesy nie powinny być obsługiwane w usługach IIS. Powinieneś rzucić to do tabeli zadań i pozwolić mu na powtarzające się zaplanowane zadanie lub usługę Windows. –

+0

@RobVious Mam do czynienia z tym samym problemem. Czy byłeś w stanie to rozwiązać? – Bitsian

+0

@Bitsian yeah, zobacz moją odpowiedź poniżej – RobVious

Odpowiedz

5

skończyło się na przerabianiu drogę moja asynchroniczny e-mail wysyłany jest z następujących powodów:

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))); 
     } 

pamiętać, że jest to rozwiązanie tymczasowe, i że jest poprawny sposób (wydaje się) do obsługi poczty elektronicznej jest korzystanie z niektórych rodzaj queue service sparowany z rolą roboczą lub inną usługą Windows, aby wysłać wiadomości.

+0

Sprawdź to - prawidłowy sposób to zrobić: http://www.aspsnippets.com/Articles/How-to-send-email-Asynchronicznie-w-ASPNet-using-Background -Thread.aspx – niico

+0

Kiedy próbuję tego podejścia, pojawia się ten błąd: Nie można uzyskać dostępu do unieszkodliwionego obiektu. Nazwa obiektu: "System.Net.Mail.SmtpClient". – thomas