【发布时间】:2015-10-01 21:19:00
【问题描述】:
我正面临需要帮助才能了解如何正确进行的情况。
我有一个 Action,它是一种预算形式。用户填写完所有字段后,用户将按“发送”按钮保存预算。
发送按钮将保存数据,然后向所有公司发送电子邮件。当我说所有公司时,我的意思是大约 1000 家公司。
但是,问题是当我按下发送按钮时,在为公司发送电子邮件时页面被锁定,在向所有公司发送电子邮件后,网站返回视图。
我想做的是,当用户按下发送按钮时,网站会节省预算,开始在后台发送电子邮件,几乎立即将视图返回给用户,然而,网站正在后台向 1000 家公司发送电子邮件。
我是怎么做到的?这是我的方法的签名:
public async Task<PartialViewResult> EnviarProposta(PostOrcamentoServicoProposta proposta)
{
// persist the budget
SaveData(proposta);
// get all companies...
var companies = getCompanies(proposta);
foreach (var company in companies)
await EmailFactory.SendBudget(proposta, company).SendAsync();
return PartialView(proposta);
}
SendAsync 是 SMTP 的异步方法。
问题是,我如何简单地将发送电子邮件方法扔到后台并返回视图,而无需等待发送完成?
第二个问题是我正在使用一个框架来转换电子邮件中的视图,因此,为此我们需要控制器的上下文。
我应该使用 task.factory.startnew 吗?
我应该使用线程吗?
注意事项: 不幸的是,异步控制器操作在这种情况下没有帮助,因为它们在等待异步操作完成时不会对用户产生响应。它们只解决与线程池和应用程序容量相关的内部问题。
【问题讨论】:
-
基本上你需要启动一个线程并在该线程上执行电子邮件的发送,这样它就可以从为请求服务的当前线程中解脱出来
标签: c# asp.net-mvc asynchronous async-await task