2013-10-04 10 views
8

tôi đã có sau đây để gửi email, mà làm việc:Một module không đồng bộ hoặc xử lý hoàn thành trong khi một hoạt động không đồng bộ được vẫn chưa

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

Nhưng nó ngăn chặn các ứng dụng web cho đến khi email được gửi đi, vì vậy tôi quyết định thử gửi không đồng bộ:

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

nào tôi có thể thấy bị đối xử không đồng bộ nếu tôi gỡ lỗi, nhưng tôi luôn luôn nhận được như sau:

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

Tôi đang làm gì sai?

+0

Không đồng bộ không làm gì để thay đổi thực tế rằng các quy trình chạy dài không nên được xử lý bên trong IIS. Bạn nên ném điều này vào một bảng nhiệm vụ và để cho một nhiệm vụ theo lịch trình định kỳ hoặc một dịch vụ windows chọn nó lên. –

+0

@RobVious Tôi đang đối mặt với cùng một vấn đề. Bạn có thể giải quyết nó không? – Bitsian

+0

@Bitsian yeah, hãy xem câu trả lời của tôi bên dưới – RobVious

Trả lời

5

tôi đã kết thúc làm lại cách gửi email async của tôi sẽ được gửi như sau:

public void SendAsyncEmail(MailMessage message) 
     { 

      var client = new SmtpClient("mail.hover.com", 587) 
      { 
       Credentials = new NetworkCredential("[email protected]m", "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))); 
     } 

Lưu ý rằng đây là một giải pháp tạm thời, và rằng cách chính xác (có vẻ như) để xử lý gửi email cho là sử dụng một số loại queue service được ghép nối với vai trò của nhân viên hoặc dịch vụ cửa sổ khác để bật tin nhắn.

+0

Kiểm tra điều này - cách chính xác để thực hiện: http://www.aspsnippets.com/Articles/How-to-send-email-Asynchronously-in-ASPNet-using-Background -Thread.aspx – niico

+0

Khi tôi thử phương pháp này, tôi nhận được lỗi này: Không thể truy cập một đối tượng được xử lý. Tên đối tượng: 'System.Net.Mail.SmtpClient'. – thomas

Các vấn đề liên quan