9

Trong khi sử dụng SendMailAsync Tôi nhận được lỗi sau:SendMailAsync: 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

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

Mã của tôi:

public static async Task SendEmail(MessageContent messageContent, string emailBody) 
{ 
    SmtpClient smtpClientNoSend = new SmtpClient(); 
    await smtpClientNoSend.SendMailAsync(mailMessage); 
} 

Gọi Từ Bộ điều khiển:

public async System.Threading.Tasks.Task<ActionResult> Register() 
{ 
    await SendEmail(); 
} 

private void SendEmail() 
{ 
    SMTPEmail.SendEmail(msg, output.ToString()); 
    return null; 
} 

Trả lời

19

Phân cấp cuộc gọi của bạn bị hỏng. Bạn không nên sử dụng async void, đó là ment cho chỉ xử lý sự kiện, sử dụng async Task thay vì:

public static Task SendEmailAsync(MessageContent messageContent, string emailBody) 
{ 
    SmtpClient smtpClientNoSend = new SmtpClient(); 
    return smtpClientNoSend.SendMailAsync(mailMessage); 
} 

public async Task<ActionResult> Register() 
{ 
    await SendEmailAsync(); 
} 

private Task SendEmailAsync() 
{ 
    return SMTPEmail.SendEmailAsync(msg, output.ToString()); 
} 

Side note - Tôi không chắc chắn lý do tại sao bạn có rất nhiều SendMail phương pháp, bạn có thể thu hẹp chúng xuống một đơn gọi phương thức.

+0

Tôi không hiểu phương thức 'Register()'. Nó có nên bao gồm câu lệnh 'return' không? – RaelB

+0

@ RaelB Không, đó là phương thức trả lại 'Task'. Nó tương đương với trả về 'void' từ một phương thức đồng bộ. –

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