Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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/29.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#/Visual C+;+;)到ASP.NET(C#)的一些问题_C#_Asp.net - Fatal编程技术网

从应用程序编程(C#/Visual C+;+;)到ASP.NET(C#)的一些问题

从应用程序编程(C#/Visual C+;+;)到ASP.NET(C#)的一些问题,c#,asp.net,C#,Asp.net,在我工作的新地方,我一直负责开发一个web应用程序框架。我是ASP.NET框架的新手(6个月左右),事情看起来很简单,但我有几个问题想问你们ASP专业人士。我会注意到我对C#并不陌生 长寿命对象/缓存 处理不希望在每次创建页面时重新初始化的对象的首选方法是什么?我注意到有一个缓存管理器可以使用,但是使用它有什么警告吗?例如,我可能希望缓存各种内容,我正在考虑在缓存周围编写一个以缓存名称为前缀的包装器,以便使用相同的底层.NET缓存管理器实现不同的缓存 1) 对于要缓存的对象,我需要考虑哪些设计因

在我工作的新地方,我一直负责开发一个web应用程序框架。我是ASP.NET框架的新手(6个月左右),事情看起来很简单,但我有几个问题想问你们ASP专业人士。我会注意到我对C#并不陌生

长寿命对象/缓存

处理不希望在每次创建页面时重新初始化的对象的首选方法是什么?我注意到有一个缓存管理器可以使用,但是使用它有什么警告吗?例如,我可能希望缓存各种内容,我正在考虑在缓存周围编写一个以缓存名称为前缀的包装器,以便使用相同的底层.NET缓存管理器实现不同的缓存

1) 对于要缓存的对象,我需要考虑哪些设计因素

2) 如果我想在web应用程序的生命周期中实现一个管理器(显然是线程安全的),那么在app_启动时初始化它并在app_结束时杀死它就足够了吗?或者这种做法是不可取的,并且任何管理器都是在所服务页面的构造函数/init方法中唯一创建的

3) 如果我在应用程序启动时初始化了一个长期对象,那么当应用程序池被回收时,这是否会受到影响?如果它在应用程序端被销毁,是否只是被销毁然后重新创建?我对这个限制很满意,我只想说清楚一点:)

长寿命线程

我对此做了一些研究,这个问题可能是多余的。在ASP.NET环境中启动工作线程并使用windows服务执行长时间运行的任务似乎不安全。后者并不完全是一个问题,目标环境将具有安装服务的功能,但我只是想再次确认这是绝对必要的。我理解线程可以抛出异常并终止,但我不理解禁止它们背后的原因。如果.NET提供了一个包含System.thread的线程框架,而且还提供了应用程序服务器何时将回收应用程序池的通知,那么我们实际上可以对此采取一些措施,而不仅仅是在停止时死掉

ASP.NET中是否有线程解决方案,或者基本上是“服务”

我相信我会有更多的疑问,但现在就到此为止

编辑:谢谢你的回复

1)缓存的主要内容是了解缓存的生存期,以及缓存中缓存(特别是大型)对象的效果。考虑缓存每次在您的Debug .ASPX页面被击中时生成的内存中的1MB对象;经过一年的制作,你每小时可以点击10000次,而物体的寿命是2小时。您可以很容易地占用大量内存,这可能会影响性能,还可能会导致缓存中的内容过早过期,从而导致其他问题。只要你明白这一切的影响,你就没事

2) 在应用程序\u开始时启动它,在应用程序\u结束时关闭它是可以的。您还可以使用http模块实现自定义HttpApplication

3) 是的,当你的应用程序池被回收时,它会调用应用程序_End,所有东西都会被关闭和销毁


4) (线程)线程的问题与缩放有关。如果您点击default.aspx页面,它会触发一个线程,并且该页面在2分钟内达到10000,那么您的应用程序池中可能会运行大量线程。同样,只要您了解启动线程的后果,您就可以这样做。线程池是另一种情况,asp.net运行时使用线程池来处理请求,因此,如果您绑定所有线程池线程,您的应用程序可能会挂起,因为没有线程可用于处理请求。

因此,以下是您要记住的主要事项。IIS可能会在您工作时重置或自行重置(基于条件)。除非在等待响应时停止呈现页面,否则您永远无法知道何时会发生这种情况(在这种情况下,浏览器会注意到页面最终停止响应)

线程 这就是为什么你不应该在ASP.NET应用程序中使用线程的原因。但是,这并不是说你不能。再一次,你需要正确配置IIS引擎(我在生成大量线程时挂起了它,但这可能与机器有关)。如果你相信没有人会让ASP.NET重新编译你的代码/重新启动你的应用程序(例如,通过保存
web.config
),您会遇到比其他方式更少的问题

与运行Windows服务不同,您可以使用同样在IIS/.NET上运行的ASMX或WCF服务。这取决于您。但有了多个服务池,就安装和生成而言,它允许您将所有内容保持在“同一环境”中。它们显然不共享同一进程池/内存空间

“你错了!” 我相信有人会读到这篇文章,然后说“但是你不能在ASP.NET中线程!!!”,所以这里的链接向你展示了如何从古老的MSDN中实现这一点

现在转到长寿命对象/缓存

缓存 所以,这取决于缓存的含义。这是按用户、按系统、按应用程序、按数据库还是按页面进行的?每种缓存都是可能的,但根据需要,需要一些创新和复杂性

每页执行此操作的最简单方法是使用静态变量。如果您将其用于用户代码内容,这也是非常危险的,因为如果有多个用户使用此页面,则没有向最终用户指示变量将要更改。相反,如果您