异步操作仍在等待...... ASP.NET Identity 2.0

时间:2014-04-02 09:19:11

标签: asp.net-identity

我正在实施一周前发布的新版ASP.NET Identity 2.0。

IdentityConfig.cs正在完成其工作,用户的信息被添加到数据库中,并且向用户发送电子邮件以进行确认。一切都很好,但是这个错误是不必要的(这听起来像是脚本之间的竞争)。它只在我使用电子邮件服务时被解雇:

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

背后的代码如下:

 public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        var mailMessage = new MailMessage(
           "******@d******.com",
           message.Destination,
           message.Subject,
           message.Body
           );

        // Send the message
        SmtpClient client = new SmtpClient();
        client.SendAsync(mailMessage, null);
        return Task.FromResult(0);
    }
}

我该如何解决这个问题?

提前致谢。

3 个答案:

答案 0 :(得分:0)

SendAsync()需要await ed ...

public async Task SendAsync(IdentityMessage message)
{
    var mailMessage = new MailMessage(
       "******@d******.com",
       message.Destination,
       message.Subject,
       message.Body
       );

    // Send the message
    SmtpClient client = new SmtpClient();
    await client.SendMailAsync(mailMessage);
}

答案 1 :(得分:0)

当您致电client.SendAsync时,它会在后台启动一个线程来发送电子邮件,但您的方法会返回一个立即完成的任务。抛出此异常是因为您应该进行某种同步,以确保在发送电子邮件的后台线程完成之前,您返回的任务未完成。

但是,您不需要首先创建后台进程。您的方法已经是异步的,因此调用方法将一直阻塞直到它完成。只需使用Send代替SendAsync即可。您还应该使用using块来确保正确放置SMTP客户端。

以下是一个示例实现:

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        var mailMessage = new MailMessage(...);

        return Task.Run(() =>
        {
            using (var client = new SmtpClient())
            {
                try
                {
                    client.Send(mailMessage);
                }
                catch(Exception e)
                {
                    //log error
                    throw;
                }
            }
        });
    }
}

答案 2 :(得分:-1)

更改行:

client.SendAsync(mailMessage, null);

为:

client.Send(mailMessage);