ASP.NET MVC使线程保持会话活动

时间:2013-01-23 05:02:18

标签: asp.net-mvc multithreading session

我有一个场景,我从一个线程将执行一些后台工作的动作开始一个新线程。有时,如果线程花费更长的时间来完成工作,则会话似乎已过期。有没有办法让会话在新线程中保持活动状态?

2 个答案:

答案 0 :(得分:3)

您应该避免在后台线程中访问任何HttpContext资源,例如Session。您可以将此线程需要的信息作为参数传递。

例如:

public ActionResult Index()
{
    // Get the value you will need from the session
    SomeModel model = (SomeModel)Session["myModel"];

    // start a new Thread
    Thread thread = new Thread(DoWork);
    thread.Start(model);

    return View();
}

private void DoWork(object state)
{
    SomeModel model = (SomeModel)state;
    // do the work here without ever accessing the HttpContext
}

如果您需要来自多个来源的信息,例如Sessions,Models,Cookies等等,那么......只需构建一个新模型即可将它们聚合在一起:

public class MyModel
{
    public SomeModelFromSession SessionData { get; set; }
    public SomeModelFromCookie CookieData { get; set; }
    ...
}

然后在启动时将此新模型传递给后台线程。

答案 1 :(得分:0)

将文件复制到本地文件系统时,将会话/必要数据序列化为具有相同文件名的json文件(或将该信息写入数据库)。

我的建议是;

  • 这应该由单独的Windows服务或后台正在运行的可执行文件处理。
  • 如果您希望Web应用程序处理此问题,您可以在Web应用程序启动时创建一个线程,并检查上载的新文件以上载到S3。但缺点是,您无法知道IIS何时回收Web应用程序,而某些情况下,您可以拥有同一Web应用程序的多个实例(具体取决于应用程序池的配置)。因此,您必须处理应用程序重新启动并优雅地拥有多个实例。
  • 或许您可以使用队列系统(MSMQ,数据库可能)
  • 您甚至可以使用Redis或数据库。