[英]C# using statement cache
它必须是一个非常转储问题,但我想知道我是否可以使用缓存对象作为using语句的一部分,例如
using(Class1 sample = Cache.GetClass<Class1>())
Cache.class是一个静态类,它使用memoryCache存储Class1的副本,而GetClass是从缓存中获取存储对象的副本(如果已存在)。
在我的现实生活中(几乎,但是简单)exmaple,我有这个:
using (dataDesignerClass dds = Cache.GetClass<dataDesignerClass>()){
...
Dataset ds = new Dataset();
dds.dataadapter1.fill(ds); //dds is the data designer which contains all the sqlconnection, sql commands, adapters..etc which can get quite big
...
}
..对我来说似乎没问题,但是我发现有些数据集(ds)没有被dataadapter1填充,没有返回错误。
我的GetClass静态类:
public static T GetClass<T> () where T: class
{
string keyName = "CACHE_" + typeof(T).Name.ToUpper();
CacheItem cacheItem = null;
cacheItem = GetCache(keyName); //a function to return the cache item
if (cacheItem == null)
{
T daClass = Activator.CreateInstance(typeof(T)) as T; //the constructor will call the initilalization routine
AddCache(keyName, daClass);
return daClass;
}
return (T)cacheItem.Value;
}
有人可以解释它失败的原因吗?
我认为这是一个坏主意,用using
你的东西缓存。
背后的想法using
的是其配置的所有非托管内存分配,处理的对象有被破坏之前。 处置后不应使用您的对象。 这里的问题是你不打算破坏和删除对象,因此你将它保存在缓存中!
此外, DataReader
在某种程度上是光标类型的对象。 它不会让您重复使用它,尤其是当您使用多个线程时。
处置对象很可能会破坏您的软件并产生意外和不需要的结果。 不要使用using
此方案。
重用共享对象有时是很好的做法,但您需要确保它可以重用。 在您的程序中,您将数据适配器存储在缓存中并尝试在不同的线程之间重用它,这有时会导致奇怪的结果,因为数据适配器无法共享。 映像两个线程获取适配器的相同实例并同时修改它! IMO数据适配器非常精简,您可以为每个数据库读取创建一个新实例,不需要缓存和重用它,这会使事情变得复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.