0

我有一个场景,我从一个线程将执行一些后台工作的操作启动一个新线程。有时,如果线程需要更长的时间来完成工作,会话似乎会过期。有什么方法可以让会话在新线程中保持活跃?

4

2 回答 2

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
}

如果您需要来自多个来源的信息,例如会话、模型、Cookie 等等……只需构建一个新模型,将它们全部聚合起来:

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

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

于 2013-01-23T07:03:16.803 回答
0

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

我的建议是;

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