我有一个场景,我从一个线程将执行一些后台工作的动作开始一个新线程。有时,如果线程花费更长的时间来完成工作,则会话似乎已过期。有没有办法让会话在新线程中保持活动状态?
答案 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文件(或将该信息写入数据库)。
我的建议是;