C#:ASP.NET MVC中的非阻塞Action方法

时间:2015-03-04 14:21:18

标签: c# asp.net-mvc asp.net-mvc-5

我正在创建一个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("/");
    }

2 个答案:

答案 0 :(得分:2)

我最近为一个项目做了这个,我使用了Task.Run()

Task.Run(() => SomeMethod(someVariable));

答案 1 :(得分:2)

经过几天的研究并尝试尽可能防止阻止UI,我找到了答案:使用户会话只读。来自this post的@SamStephens的回答给了我想要的结果。 这是:

[SessionState(SessionStateBehavior.ReadOnly)]