C# 使用语句缓存
C# using statement cache
这一定是一个很垃圾的问题,但我想知道我是否可以使用缓存对象作为 using 语句的一部分
例如
using(Class1 sample = Cache.GetClass<Class1>())
Cache.class 是一个 static 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
...
}
..这对我来说似乎没问题,但我发现 SOMETIMES 数据集 (ds) 未由 dataadapter1 填充,没有返回错误。
我的 GetClass 静态 class:
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;
}
有人可以解释为什么失败吗?
重用共享对象有时是一种很好的做法,但您需要确保它可以重用。在您的程序中,您将数据适配器存储在缓存中并尝试在不同线程之间重用它,这有时会导致奇怪的结果,因为数据适配器无法共享。想象两个线程获取适配器的相同实例并同时修改它! IMO 数据适配器非常精简,您可以为每个数据库读取创建一个新实例,没有必要缓存和重用它,这使事情变得复杂。
我认为对缓存的内容使用 using
是个坏主意。
using
背后的想法是它处理所有非托管内存分配并在对象被破坏之前处理它。你不应该在你的对象被处理后使用它。这里的问题是你不是要破坏和删除对象,因此你将它保存在缓存中!
此外,DataReader
有点像游标类型的对象。它不会喜欢你重复使用它,尤其是当你使用多个线程时。
处理该对象很可能会破坏您的软件并产生意想不到的不良结果。在这种情况下不要使用 using
。
这一定是一个很垃圾的问题,但我想知道我是否可以使用缓存对象作为 using 语句的一部分 例如
using(Class1 sample = Cache.GetClass<Class1>())
Cache.class 是一个 static 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
...
}
..这对我来说似乎没问题,但我发现 SOMETIMES 数据集 (ds) 未由 dataadapter1 填充,没有返回错误。
我的 GetClass 静态 class:
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;
}
有人可以解释为什么失败吗?
重用共享对象有时是一种很好的做法,但您需要确保它可以重用。在您的程序中,您将数据适配器存储在缓存中并尝试在不同线程之间重用它,这有时会导致奇怪的结果,因为数据适配器无法共享。想象两个线程获取适配器的相同实例并同时修改它! IMO 数据适配器非常精简,您可以为每个数据库读取创建一个新实例,没有必要缓存和重用它,这使事情变得复杂。
我认为对缓存的内容使用 using
是个坏主意。
using
背后的想法是它处理所有非托管内存分配并在对象被破坏之前处理它。你不应该在你的对象被处理后使用它。这里的问题是你不是要破坏和删除对象,因此你将它保存在缓存中!
此外,DataReader
有点像游标类型的对象。它不会喜欢你重复使用它,尤其是当你使用多个线程时。
处理该对象很可能会破坏您的软件并产生意想不到的不良结果。在这种情况下不要使用 using
。