如何在Task.Run中调用异步方法
本文关键字:调用 异步方法 Run Task | 更新日期: 2023-09-27 18:03:17
我需要以异步方式发送邮件。我已经想出了使用剃刀生成器从剃刀视图生成Html模板。现在我需要使用SmtpClient。SendMailAsync将html作为邮件发送。但是我发现Razor生成器需要相当长的时间,我不想在我的send mail方法中包含模板生成部分,因为send mail方法不应该关心获取Html模板。
我有样例代码:
public static void SendEmailAsync<TModel>(TModel model, string templatePath, string subj, string toEmail, string cc = null, string bcc = null)
{
string templateFilePath = HostingEnvironment.MapPath(templatePath);
// Generate the email body from the template file.
// 'templateFilePath' should contain the absolute path of your template file.
if (templateFilePath != null)
{
Task.Run(() =>
{
var emailHtmlBody = Engine.Razor.RunCompile(File.ReadAllText(templateFilePath),
templateFilePath, model.GetType(), model);
SendEmailAsync(subj, emailHtmlBody, toEmail, cc, bcc);
});
}
else
{
throw new System.Exception("Could not find mail template.");
}
}
和SendMailAsync的签名是:
static async Task SendEmailAsync(string subj, string message, string toEmail, string cc = null, string bcc = null)
{
//Reading sender Email credential from web.config file
string fromEmail = ConfigurationManager.AppSettings["FromEmail"].ToString();
string fromName = ConfigurationManager.AppSettings["FromName"].ToString();
//creating the object of MailMessage
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress(fromEmail, fromName); //From Email Id
mailMessage.Subject = subj; //Subject of Email
mailMessage.Body = message; //body or message of Email
mailMessage.IsBodyHtml = true;
string[] toMuliId = toEmail.Split(',');
foreach (string toEMailId in toMuliId)
{
mailMessage.To.Add(new MailAddress(toEMailId)); //adding multiple TO Email Id
}
if (cc != null)
{
string[] ccId = cc.Split(',');
foreach (string ccEmail in ccId)
{
mailMessage.CC.Add(new MailAddress(ccEmail)); //Adding Multiple CC email Id
}
}
if (bcc != null)
{
string[] bccid = bcc.Split(',');
foreach (string bccEmailId in bccid)
{
mailMessage.Bcc.Add(new MailAddress(bccEmailId)); //Adding Multiple BCC email Id
}
}
SmtpClient smtp = new SmtpClient
{
EnableSsl = true,
Credentials = new NetworkCredential("", "")
};
//network and security related credentials
await smtp.SendMailAsync(mailMessage); //sending Email
}
没有抛出异常,但我得到错误:
系统。InvalidOperationException:此时不能启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在Page生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保页面标记为<%@ Page Async="true" %>。此异常还可能表明试图调用"async void"方法,这在ASP中通常不支持。. NET请求处理。相反,异步方法应该返回一个Task,调用者应该等待它。
使用
await Task.Run(async () =>
{
await DoAsyncMethodAsync();
});
问题是每次发送电子邮件时都运行以下方法(这会生成初始类,这需要时间)
Engine.Razor.RunCompile
理想情况下,您应该调用以下方法,只有在抛出错误时,才调用RunCompile
Engine.Razor.Run
请参阅关于使用带缓存的模板管理器的文章