异步更新会话数据
本文关键字:数据 会话 更新 异步 | 更新日期: 2023-09-27 18:19:25
我找到了几个答案,抨击异步方式使用会话状态,例如
- 异步设计中的session
- 异步线程和会话
是否有一些条件下,从异步线程更新会话将不会或不能工作?
我的用例如下:
在app中,用户配置文件数据存储在会话中。当管理员更改用户名、组或其他配置文件信息等时,旨在异步刷新配置文件数据。
异步推力:轮询存储数据已更改的用户id的数据库表。如果数据匹配当前用户id,刷新配置文件数据,从表
中删除id我发现下面的代码异步更新会话键。
public class MyAsyncUpdateController : Controller
{
public static string MyKey = "myKey";
public ActionResult Index()
{
Session[MyKey] = "Init Data: Updated at " + DateTime.Now.TimeOfDay;
Task.Factory.StartNew(session =>
{
Thread.Sleep(10000);
var _session = (HttpSessionState)session;
if (_session != null)
_session[MyKey] = "Async Data: Updated at " + DateTime.Now.TimeOfDay ;
}, System.Web.HttpContext.Current.Session);
return RedirectToAction("OtherAction");
}
public ActionResult OtherAction()
{
string result = "";
if (Session != null && Session[MyKey] != null)
result= Session[MyKey].ToString();
return Content(result);
//Refresh until see updated timestamp
}
}
当从异步任务写入会话数据时,除了null检查之外,还有什么其他的考虑因素或保护吗?
在ASP中使用Task.Factory.StartNew
。. NET是危险的,可能导致意想不到的行为
原因是ASP。. NET运行时不知道您已将此工作排队,因此它甚至不知道后台工作存在。由于各种原因,IIS/ASP。. NET必须偶尔回收您的应用程序。如果在此回收发生时正在运行后台工作,那么该工作将神秘地消失
而且,HttpContext.Current.Session
不是线程安全的。当在同一个键上异步地使用多个请求时,可能会遇到竞争条件,导致无效数据。
我强烈建议你考虑其他选择:
-
使用持久队列(如Stephan在他的博客中建议的),如MSMQ或Azure MB。
-
使用
HostingEnvironment.QueueBackgroundWorkItem
或替代StephansBackgroundTaskManager
注册与ASP工作。净ThreadPool。 -
考虑同步运行此代码
你还应该阅读更多关于尽早从ASP返回的信息。. NET请求和Using Task。在同步asp.net控制器中运行