ASP.net缓存访问导致foreach循环中的Collection Modified异常
发布时间:2020-12-16 06:38:52 所属栏目:asp.Net 来源:网络整理
导读:首先,先做好事.这是支持团队提供的一些异常信息.我知道它发生的行和代码.它发生在对从缓存中获取的字典的FirstOrDefault调用中. 1) Exception Information*********************************************Exception Type: System.InvalidOperationExceptionMe
首先,先做好事.这是支持团队提供的一些异常信息.我知道它发生的行和代码.它发生在对从缓存中获取的字典的FirstOrDefault调用中.
1) Exception Information ********************************************* Exception Type: System.InvalidOperationException Message: Collection was modified; enumeration operation may not execute. Data: System.Collections.ListDictionaryInternal 现在我想模拟问题,我可以在一个简单的ASP.net应用程序中完成. public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender,EventArgs e) { if (!IsPostBack) { var data = Cache["key"]; if (data == null) { var dict = new Dictionary<int,string>(); for (int i = 0; i < 10; i++) { dict.Add(i,"i"); } Cache["key"] = dict; } } } protected void ButtonProcess_Click(object sender,EventArgs e) { var data = Cache["key"] as Dictionary<int,string>; if (data != null) { foreach (var d in data.Values) //In actual code there is FirstOrDefault here { Thread.Sleep(1000); if (d.Contains("5")) { //some operation } } } } protected void Button2_Click(object sender,string>; if (data != null) { data.Add(new Random().Next(),"101"); Cache["key"] = data; } } } 现在假设有2个请求: 请求1 – 有人点击了button_Process,并且正在对缓存对象进行一些操作 我理解这个问题 – 它正在发生,因为我们正在访问相同的内存.我脑子里有两个解决方案: 请帮我解决一下这个.我无法找到有效的解决方案.处理这种情况的最佳方法是什么? 解决方法
发生这种情况是因为您直接使用对象,位于缓存中.良好的做法,避免那些异常和其他奇怪的行为(当你不小心修改缓存对象)正在使用缓存数据的副本.有几种方法可以实现它,比如做克隆或某种深层复制.我更喜欢将对象保存在高速缓存中序列化(您喜欢的任何类型 – json / xml / binary或w / e else),因为(de)序列化会对您的对象进行深层复制.以下小代码片段将澄清一些事情:
public static class CacheManager { private static readonly Cache MyCache = HttpRuntime.Cache; public static void Put<T>(T data,string key) { MyCache.Insert(key,Serialize(data)); } public static T Get<T>(string key) { var data = MyCache.Get(key) as string; if (data != null) return Deserialize<T>(data); return default(T); } private static string Serialize(object data) { //this is Newtonsoft.Json serializer,but you can use the one you like return JsonConvert.SerializeObject(data); } private static T Deserialize<T>(string data) { return JsonConvert.DeserializeObject<T>(data); } } 用法: var myObj = new Dictionary<int,int>(); CacheManager.Put(myObj,"myObj"); //... var anotherObj = CacheManager.Get<Dictionary<int,int>>("myObj"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc-4 – 从ASP.NET MVC Web API返回400而不是404
- 捕获从ASP.NET生成的HTML
- asp.net-mvc-4 – 在MVC中的App_Start()文件夹中使用AuthCo
- asp.net核心 – 无法使用托管代理在Visual Studio Team Ser
- asp.net – 在不使用HttpRequest的情况下获取主机名
- asp.net-mvc – Excel Interop MVC
- 存储ASP.NET会话变量的最佳解决方案是什么? StateServer还
- asp.net – 如何获取trace.axd请求返回404?
- asp.net-mvc – 通过伪造上下文测试:实体框架
- 自定义asp.net页面中的Microsoft Communicator Presence指示
推荐文章
站长推荐
- Forms身份验证应用程序中的ASP.NET Web服务
- asp.net-mvc – 在ASP.net MVC单元测试中访问Mod
- asp.net – 将默认的MVC 4模板部署到Windows Azu
- asp.net-mvc-2 – 在MVC 2中使用自定义TextWrite
- asp.net-mvc – ASP.NET MVC:获取所有控制器
- asp.net-mvc – 如何在ASP.NET Core中启用Client
- wcf – 我可以在实体框架4.3中使用RIA服务吗?
- asp.net-mvc – ModelMetadata.Watermark和MVC V
- asp.net-mvc – 通过子域名到mvc或api的ASP.NET路
- asp.net-core – 当前的运行时目标框架与项目不兼
热点阅读