Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态集合与asp.net_C#_Asp.net_Static - Fatal编程技术网

C# 静态集合与asp.net

C# 静态集合与asp.net,c#,asp.net,static,C#,Asp.net,Static,我正在开发一个通用层,它允许我执行基本的保存、删除和加载操作,但是遇到了一个我也不知道答案的问题,我立即想到了StackOverflow 我有一个asp.net应用程序,它引用一个单独的项目业务层,该层包含我所有的类定义。我的一个类ObjectFactory负责实例化对象并将它们存储在静态字典中。其思想是,如果它已经被实例化,它将从静态集合中检索它的定义。我之所以选择这样做,是因为我只想获取一次类的propertyinfo[],因为根据Joel Pobar的MSDN文章,获取这些信息的成本相当高

我正在开发一个通用层,它允许我执行基本的保存、删除和加载操作,但是遇到了一个我也不知道答案的问题,我立即想到了StackOverflow

我有一个asp.net应用程序,它引用一个单独的项目业务层,该层包含我所有的类定义。我的一个类ObjectFactory负责实例化对象并将它们存储在静态字典中。其思想是,如果它已经被实例化,它将从静态集合中检索它的定义。我之所以选择这样做,是因为我只想获取一次类的propertyinfo[],因为根据Joel Pobar的MSDN文章,获取这些信息的成本相当高

我的问题是,尽管asp.net项目引用了包含所有业务逻辑的类库,但是这个静态集合是否可以在全球范围内使用?例如,如果两个用户同时在我的网站上访问我网站的两个独立部分,其中涉及实例化两个独立的对象,ObjectFactory中的缓存是否会同时包含这两个项目?或者静态集合是基于每个用户的,即静态集合仅包含特定用户的项

由于我的业务层没有访问web缓存的权限,我不确定是否要创建我的业务层参考系统.web,然后插入其中

对不起,如果我可能混淆了任何人,但我非常乐意提供进一步的信息,如果需要的话


提前感谢,Onam。

存储在静态变量中的对象在整个应用程序域中共享。所有线程和所有web请求将使用相同的值。这意味着这些对象必须是线程安全的,否则您将面临失败,当然,这只会在您投入生产后失败,因为这些问题通常不会在开发过程中出现,通常情况下,没有人真正测试您的系统。

存储在静态变量中的对象在整个应用程序域中共享。所有线程和所有web请求将使用相同的值。这意味着这些对象必须是线程安全的,否则您将面临失败,当然,这只会在您投入生产后失败,因为这些问题通常不会在开发过程中出现,通常情况下,没有人会真正测试您的系统。

除了@Steven的答案,我还要补充一点,每次应用程序池回收时,静态集合都会清空,如果您最终在多台服务器上运行,每个服务器都会有自己的集合


因此,除了使字典中的项目线程安全外,您还应该使用and及其GetOrAdd和AddOrUpdate方法来确保对字典本身的线程安全访问,而不是普通字典类,后者不是线程安全的。

除了@Steven的答案,我要补充的是,每次应用程序池回收时,静态集合都将清空,如果您最终在多个服务器上运行,那么每个服务器都将有自己的集合


因此,除了使字典中的项具有线程安全性外,还应该使用和的GetOrAdd和AddOrUpdate方法来确保对字典本身的线程安全访问,而不是普通字典类,后者不是线程安全的。

在给定的应用程序生命周期内,所有线程都可以使用常规静态字段

无论如何,使用静态字段时要小心。请注意,常规字典不是线程安全的


您需要考虑在执行任何写操作Add、Delphi时,将其他线程阻塞到您的字典中。或者您会遇到同步问题,例如,您的属性的反射信息可能会添加两次或更多

常规静态字段可用于给定应用程序生命周期内的所有线程

无论如何,使用静态字段时要小心。请注意,常规字典不是线程安全的


您需要考虑在执行任何写操作Add、Delphi时,将其他线程阻塞到您的字典中。或者您会遇到同步问题,例如,您的属性的反射信息可能会添加两次或更多

问题是我希望我的静态字典对所有用户都可用,因为它只用于阅读。每一个被实例化的对象我都希望存储在全局级别,这样它就只执行一次。。。这是个坏主意吗?不,这是很常见的模式。但这并不能免除您需要将类设计为线程安全的。您可能还想查看一个合适的IoC容器,比如这里提到的其中一个:您确定它只用于阅读吗?如果您在启动时加载所有可能的值,那么它确实是安全的
没有任何锁定,但这不是你的问题所暗示的。而且它仍然要求项目本身在所有实例成员上都是线程安全的。也就是说,虽然我很想推广线程安全字典,但我有自己的,而且我认为ConcurrentDictionary也很酷,如果你没有很多同时写入,那么ReaderWriterLockSlim保护普通字典可能更好。嗯,这实际上是一个更好的方法。如果在我的web应用程序的第一次启动时,我实例化了我的所有对象,并将它们添加到缓存中,并强制其为只读,这将在不久的将来消除一些复杂性……问题是,我希望我的静态字典对所有用户都可用,因为它只用于阅读。每一个被实例化的对象我都希望存储在全局级别,这样它就只执行一次。。。这是个坏主意吗?不,这是很常见的模式。但这并不能免除您需要将类设计为线程安全的。您可能还想查看一个合适的IoC容器,比如这里提到的其中一个:您确定它只用于阅读吗?如果您在启动时加载所有可能的值,那么它确实是安全的,没有任何锁定,但这不是您的问题所暗示的。而且它仍然要求项目本身在所有实例成员上都是线程安全的。也就是说,虽然我很想推广线程安全字典,但我有自己的,而且我认为ConcurrentDictionary也很酷,如果你没有很多同时写入,那么ReaderWriterLockSlim保护普通字典可能更好。嗯,这实际上是一个更好的方法。如果在我的web应用程序第一次启动时,我实例化了所有对象并将它们添加到缓存中,并强制其为只读,这将在不久的将来消除一些复杂性…我也遇到了System.Runtime.MemoryCache命名空间,这似乎与System.web.cache相似,但我认为该缓存不是在全球范围内可用?@Onam我认为这个问题与静态场的生命周期无关。也许你会问另一个关于这个话题的问题,因为评论不是为了解决问题,而是为了澄清答案,添加更多信息或提出增强建议。我也遇到过System.Runtime.MemoryCache命名空间,它似乎与System.Web.Cache相似,但我认为该缓存在全局级别不可用?@Onam我认为这个问题与静态字段的生命周期无关。也许你会问另一个关于这个话题的问题,因为评论不是为了解决问题,而是为了澄清答案,添加更多信息或建议改进。