我有一个场景,我从一个线程将执行一些后台工作的操作启动一个新线程。有时,如果线程需要更长的时间来完成工作,会话似乎会过期。有什么方法可以让会话在新线程中保持活跃?
问问题
1043 次
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 回答