我正在创建一个ASP.NET MVC 5 Web站点,我有一个操作,这需要大量时间来执行(从EWS2.0托管API的交换中导入电子邮件)。 问题是当客户端触发导入操作方法时,整个站点都是阻塞的,没有人可以打开/ Home / Index例如或者不能向服务器发出任何请求,之后抛出异常(Timeout)如果没有人交互在导入过程中使用站点 - 导入成功,否则由于超时异常而无法保证。 如何设置开始导入然后将用户重定向到/ home / index并继续在服务器端导入..? 这是我尝试过的:
public ActionResult Exchange(DateTime? id)
{
string url = ....;
try
{
ExchangeToDatabase etd = new ExchangeToDatabase(username, password, domain, url, id);
etd.ExportFromExchange();
}
catch (InvalidDateException ex)
{
return RedirectToAction("Display", "Error", new { returnUrl = "/", Message = ex.Message });
}
并尝试使用线程:
/*System.Threading.Tasks.Task.Factory.StartNew(() =>
{
ExchangeToDatabase etd = new ExchangeToDatabase("cbstest", "ch@rteRsmarter", "vlaeynatie", url, id);
etd.ExportFromExchange();
});
或:不起作用..
new Thread(() =>
{
ExchangeToDatabase etd = new ExchangeToDatabase("cbstest", "ch@rteRsmarter", "vlaeynatie", url, id);
etd.ExportFromExchange();
}).Start();*/
return Redirect("/");
}
答案 0 :(得分:2)
我最近为一个项目做了这个,我使用了Task.Run()
Task.Run(() => SomeMethod(someVariable));
答案 1 :(得分:2)
经过几天的研究并尝试尽可能防止阻止UI,我找到了答案:使用户会话只读。来自this post的@SamStephens的回答给了我想要的结果。 这是:
[SessionState(SessionStateBehavior.ReadOnly)]