【发布时间】:2018-04-26 07:05:55
【问题描述】:
我创建了一个控制台应用程序,用于将数据从一个数据库表迁移到另一个迁移客户记录的数据库表,因此我必须通知他们更改密码。
public static async Task<bool> SendRegisterEmail(List<MailMessage> mailMessage)
{
bool flag = true;
try
{
var smtp = new SmtpClient();
var taskEmails = mailMessage.Select(x => smtp.SendMailAsync(x));
await Task.WhenAll(taskEmails); // **Error : An asynchronous call is already in progress. It must be completed or canceled before you can call this method**
}
catch (Exception ex)
{
throw ex;
}
return flag;
}
如果我删除了 await Task.WhenAll(taskEmails),电子邮件将成功异步发送,但是当迁移操作完成时,它不会发送所有电子邮件。他们中的许多人在操作完成后关闭控制台应用程序时仍未发送,并且我有超过 1,00,000 条记录,那么如何在后台或应用程序运行中继续电子邮件发送过程,直到所有电子邮件都成功发送?
这里是数据迁移的代码:
foreach (DataRow SourceReader in DS.Tables[0].Rows)
{
insertCounter++;
using (SqlCommand DestinationCommand = DestinationConnection.CreateCommand())
{
Console.WriteLine("inserting row...");
var date = (SourceReader["LockedUntil"] == DBNull.Value ? Convert.ToDateTime("01/01/1753") : Convert.ToDateTime(SourceReader["LockedUntil"]));
DestinationCommand.CommandText = string.Format(insertQuery1, (SourceReader["CustomerGUID"] == DBNull.Value ? null : SourceReader["CustomerGUID"].ToString()), (SourceReader["FirstName"] == DBNull.Value ? null : SourceReader["FirstName"].ToString()), (SourceReader["LastName"] == DBNull.Value ? null : SourceReader["LastName"].ToString()), (SourceReader["Email"] == DBNull.Value ? null : SourceReader["Email"].ToString()), 1, PasswordManager.Encrypt(SourceReader["FirstName"].ToString() + "1!"), (SourceReader["Phone"] == DBNull.Value ? null : SourceReader["Phone"].ToString()), 1, 0, 0, date.ToString("yyyy-MM-ddTHH:mm:ss"), Convert.ToInt16(SourceReader["BadLoginCount"] == DBNull.Value ? 0 : SourceReader["BadLoginCount"]), Convert.ToInt16(SourceReader["OkToEmail"] == DBNull.Value ? 0 : SourceReader["OkToEmail"]), (SourceReader["CustomerGUID"] == DBNull.Value ? null : SourceReader["CustomerGUID"].ToString()), 2);
DestinationCommand.ExecuteNonQuery();
Console.WriteLine("AspNetUser Row inserted...!!! ");
}
if ((insertCounter % 100) == emailCounter)
{
var message = Email.AddUserForEmail(new User() { Email = (SourceReader["Email"] == DBNull.Value ? null : SourceReader["Email"].ToString()), Password = (SourceReader["FirstName"].ToString() + "1!"), FirstName = (SourceReader["FirstName"] == DBNull.Value ? null : SourceReader["FirstName"].ToString()), LastName = (SourceReader["LastName"] == DBNull.Value ? null : SourceReader["LastName"].ToString()) });
mailList.Add(message);
var flag = Email.SendRegisterEmail(mailList);
emailCounter++;
}
else if (insertCounter == totalCount)
{
var message = Email.AddUserForEmail(new User() { Email = (SourceReader["Email"] == DBNull.Value ? null : SourceReader["Email"].ToString()), Password = (SourceReader["FirstName"].ToString() + "1!"), FirstName = (SourceReader["FirstName"] == DBNull.Value ? null : SourceReader["FirstName"].ToString()), LastName = (SourceReader["LastName"] == DBNull.Value ? null : SourceReader["LastName"].ToString()) });
mailList.Add(message);
var flag = Email.SendRegisterEmail(mailList);
}
else
{
var message = Email.AddUserForEmail(new User() { Email = (SourceReader["Email"] == DBNull.Value ? null : SourceReader["Email"].ToString()), Password = (SourceReader["FirstName"].ToString() + "1!"), FirstName = (SourceReader["FirstName"] == DBNull.Value ? null : SourceReader["FirstName"].ToString()), LastName = (SourceReader["LastName"] == DBNull.Value ? null : SourceReader["LastName"].ToString()) });
mailList.Add(message);
}
// var i = Email.SendRegisterEmail((SourceReader["Email"] == DBNull.Value ? null : SourceReader["Email"].ToString()), (SourceReader["FirstName"].ToString() + "1!"), (SourceReader["FirstName"] == DBNull.Value ? null : SourceReader["FirstName"].ToString()), (SourceReader["LastName"] == DBNull.Value ? null : SourceReader["LastName"].ToString()));
}
【问题讨论】:
标签: c# asynchronous console-application smtpclient