我有一个公司代表需要执行的操作列表,我想在X分钟编辑时打开一个计时器。 所有10分钟,我喜欢要刷新的页面。
问题是许多公司代理可以访问和编辑这些操作。 所以我喜欢只在我的视图上着色项目,但如果代理“睡眠”为这X分钟 - underProcess字段重置为false;所以我开始向我的模型中添加一个字段,告诉我这个Action是“UnderProcess”(我喜欢CodeFirst :)而且我在ViewModel中添加了一个静态字典,在编辑时我得到了并添加一行与kay -actionID和编辑日期时间。 之后在我对foreach的看法中如果item.UnderProcess的样式=颜色:红色.. 编辑后的课程我从字典中删除并更改bool标志。
但那不行 - 在这X分钟后它保持红色, 我认为问题出在这个静态字典上,因为当我调试它时总是空的。
Hare My ViewModel:
public class AgentActionViewModel
{
public SupplierAction Action { get; set; }
public List<SupplierAction> Actions { get; set; }//= new List<SupplierAction>();
public static Dictionary<int, DateTime> UnderProcessFrom;
public static AgentActionViewModel()
{
UnderProcessFrom = new Dictionary<int, DateTime>();
}
}
控制器:
索引
[SupplierAuthorization]
public ActionResult AgentAction(..)
{
Response.AddHeader("Refresh", (MINUTES*60).ToString());
List<SupplierAction> actions = db.SupplierActions.ToList();
bool flag = false;
var collection = AgentActionViewModel.UnderProcessFrom.Keys;
foreach (var aId in collection)
{
if (AgentActionViewModel.UnderProcessFrom[aId].AddMinutes(MINUTES) <= DateTime.Now)
{
AgentActionViewModel.UnderProcessFrom.Remove(aId);
var action = actions.Find(a=>a.SupplierActionID == aId);
action.UnderProcess = false;
db.Entry(action).State = EntityState.Modified;
}
}
if(flag)
db.SaveChanges();
...
var vm = new AgentActionViewModel();
vm.Actions = actions.OrderByDescending(d => d.RequestDate).ToList();
return View(vm);
}
获取编辑:
[SupplierAuthorization]
public ActionResult Edit(int id = -1)
{
try
{
...
if (!a.UnderProcess)
{
a.UnderProcess = true;
db.Entry(a).State = EntityState.Modified;
db.SaveChanges();
AgentActionViewModel.UnderProcessFrom.Add(id, DateTime.Now);
}
...
}
catch (Exception ex)
{
....
if (a.UnderProcess)
{
a.UnderProcess = false;
db.Entry(a).State = EntityState.Modified;
db.SaveChanges();
AgentActionViewModel.UnderProcessFrom.Remove(id);
}
.....
}
...
}
发布编辑:
.....
if (vm.Action.UnderProcess)
{
vm.Action.UnderProcess = false;
AgentActionViewModel.UnderProcessFrom.Remove(vm.ActionID);
}
.....
我的观点:
@model oCc.IPToGo.ViewModel.AgentActionViewModel
....
<tbody>
@foreach (var item in Model.Actions)
{
<tr style="@(item.UnderProcess ? "color:red" : "")">
<td>
.....
10x抱歉我的英语不好=)
答案 0 :(得分:1)
使用静态内存作为Web应用程序中的存储库是一个坏主意,即使存储库是短期的。
主要原因是内存存储库无法扩展 - 如果您在多进程地形或多机器拓扑中运行服务器 - 内存未共享,您的计时器也不会被共享。< / p>
此外,当服务器重新启动时 - 内存已经消失,您将丢失信息。
我建议你使用一个更可扩展的存储库,如果你不能成为数据库的一部分,可能会使用memcached
。
至少,它可以更容易地调试你的问题。