小编dr.*_*vil的帖子

单例,日志记录和全局设置 - 实现好还是坏?

我有一个日志类,需要从应用程序的几乎所有地方调用.

但是,它需要在应用程序的开头设置"写入哪条路径","日志级别"以及是否"启用".

我不想每次都给这个参数或者将Logging类作为参数传递给我的应用程序中的每个对象,所以我使用单例模式进行日志记录.

最近我从紧密耦合的课程中遭受了很多痛苦,我不想再犯同样的错误,但在考虑这个之后听起来这是唯一的好解决方案.

更新:

我真的不关心记录我关心的解决类似设计问题的事情,我对另一个需要从这么多类中使用的全局设置对象遇到了同样的困境.但是将它注入到它们的每一个中只会产生可怕的开销和不太可读的代码.

您对此实施有何看法?当您遇到类似的设计决策时,您会怎么做?

PS请不要建议像"使用Log4X库"等.

.net settings singleton scope global

8
推荐指数
1
解决办法
2101
查看次数

IIS不会同时向同一客户端发送两个响应(仅适用于ASP)

我有2个ASP页面.

我向Firefox的第一页请求(在服务器端需要30秒才能处理),在30秒执行期间,我从Firefox到第二页请求另一个请求(服务器端不到1秒) ),但它确实在31秒后出现.因为它等待第一次完成请求.

当我从Firefox请求第一页然后从IE请求第二页时,它就是即时的.

所以基本上ASP-IIS 6以某种方式将每个客户端限制为一次一个请求(长处理请求).我需要在我的.NET客户端应用程序中解决这个问题.

这在3个不同的系统中进行了测试.如果要测试,可以在最后尝试ASP脚本.

在长SQL执行中或仅在耗时的ASP操作中,此行为相同.

注意:

  • 这不是关于HTTP Keep Alive
  • 它不是关于持久连接限制(我们尝试使用Net.ServicePointManager.DefaultConnectionLimit在firefox和.NET中增加此限制)
  • 这与用户代理无关
  • 这在ASP.NET中不会发生,所以我认为它与ASP.dll有关
  • 我试图在客户端而不是服务器上解决这个问题.我没有直接控制服务器它是第三方解决方案.

有没有办法解决这个问题?

示例ASP代码:

第一个ASP:

<%
Set cnn = Server.CreateObject("Adodb.Connection")
cnn.Open "Provider=sqloledb;Data Source=.;Initial Catalog=master;User Id=sa;Password=;"
cnn.Execute("WAITFOR DELAY '0:0:30'")
cnn.Close
%>
Run Code Online (Sandbox Code Playgroud)

第二个ASP:

<%
Response.Write "bla bla"
%>
Run Code Online (Sandbox Code Playgroud)

iis-6 http asp-classic

8
推荐指数
1
解决办法
3591
查看次数

将许多文件存储在磁盘中的最佳方法

我找不到问题的好标题,这就是我想要做的:

  • 这是.NET应用程序.
  • 我需要存储多达200000个对象(3KB-500KB之间)
  • 我需要从多线程每秒存储大约10个
  • 我在存储它之前使用二进制序列化
  • 我需要稍后通过整数唯一ID访问它们

最好的方法是什么?

  • 我无法记住它们,因为我会忘记内存
  • 当我将它们作为单独的文件存储在磁盘中时,可能存在的性能问题是什么?它会降低整体性能吗?
  • 我应该实现某种缓存,例如组合100个对象并将其作为一个文件写入一次.然后再解析它们.或类似的东西?
  • 应该使用数据库?(访问时间并不重要,不会有搜索,我只能通过已知的唯一ID访问几次).理论上我不需要数据库,我不想让这复杂化.

更新:

  • 我假设数据库会比文件系统慢,如果你对此有所了解就证明我错了.所以这就是为什么我也倾向于文件系统.但我真正担心的是每秒写入200KB*10的HDD(这可能是任何HDD,我不控制硬件,它是一个桌面工具,将部署在不同的系统中).
  • 如果我使用文件系统,我会将文件存储在单独的文件夹中,以避免与文件系统相关的问题(所以你可以忽略这个限制)

.net memory performance storage

8
推荐指数
1
解决办法
2097
查看次数

如何升级多个项目(同一解决方案),一次性定位3.5到4.0?

在一个大的解决方案中,我们有大约100个项目,目标都是3.5,目前在VS.NET 2010中.

现在我们想将它升级到.NET 4.0,我是否必须一个接一个地改变它们的目标?或者有没有办法自动化这个过程?

.net upgrade .net-4.0 visual-studio-2010 .net-3.5

8
推荐指数
2
解决办法
4307
查看次数

解耦与YAGNI

他们是否矛盾?

解耦是很棒的,很难实现.然而,在大多数应用程序中,我们并不真正需要它,因此我可以设计高度耦合的应用程序,除了明显的副作用之外,它几乎不会改变任何东西,例如"你不能分离组件","单元测试是痛苦的屁股"等

你怎么看?你总是试图解耦和处理开销吗?

coupling yagni decoupling

7
推荐指数
1
解决办法
1075
查看次数

内存使用情况,SortedList与List问题

我在一个存储大约15-100K数据的类中使用了SortedList().

最近我的要求发生了变化,数据不应再存储为已排序,所以我切换到了List().

但是在这种情况下,我注意到List()消耗大约20%以上的内存.

9K物品:

  • SortedList:105MB
  • 清单:125MB

15K物品:

  • SortedList:115MB
  • 清单:140MB

在我开发的环境中,记忆非常重要.而不是List()我可以使用什么来避免这种额外的内存消耗,仍然有一个非排序列表?

PS我使用HashSet(Of String)来提供唯一性检查,同时使用List(Of)来模拟SortedList.ContainsKey(),尽管我认为它不会带来这样的内存开销.

PS 2:我的应用程序在启动时有大约80 MB的基本内存分配.因此数字应为105-80 = 25,125-80 = 45,依此类推

结果

感谢所有答案,最终结果如下:

  • 您应该设置正确的容量以节省内存
  • Hashset对内存非常不满意,并且消耗的方式超出预期.这是问题所在.不知怎的,SortedList()设法使用更少的内存来实现类似的功能.

一些Bencmarks: 500个字符,250000个插入

名单(OF STring)(50000)

274毫秒 - 226 MB

SortedList(Of String,String)(50000)

34868毫秒 - 230 Mb

HashSet的

420毫秒 - 232 MB

字典(OF String,Object)

486毫秒 - 234 MB

虽然当我将减少的数量改为25时,然后:

Hashset为600.000次迭代300 Mb,其中List()为286 Mb

另外的Hashset左右的内存使用情况:http://blog.mischel.com/2008/04/09/hashset-limitations/词典(字符串,对象)是在我的测试没有太大的孰优孰劣.

.net c# memory collections performance

7
推荐指数
2
解决办法
5203
查看次数

如何在.NET中为SSL连接指定密码?

如何指定要在SSL连接中使用的密码套件?

我知道Mentalis Seclib得到了这个功能,但他们没有维护项目(并且该库中存在x64操作系统的问题),因为他们说.NET Framework 2.0引入了这些功能,但是我找不到这样做的方法在.NET Framework 3.5中.

更具体地说,我想通过使用NULL密码连接HTTPS服务,我将使用以下命令对OpenSSL执行相同的操作:

openssl s_client -connect www.example.com:443 -cipher NULL 
Run Code Online (Sandbox Code Playgroud)

我怎么能在.NET中这样做?

此外,欢迎商业或商业友好的许可图书馆建议.

.net ssl tcp

7
推荐指数
1
解决办法
5652
查看次数

如何获取HttpWebRequest连接的服务器的IP地址?

DSN可以返回多个IP地址,而不是在我的请求之后使用DNS解析来获取IP地址我希望获得我的HttpWebRequest连接到的IP.

反正在.NET 3.5中有没有这样做?

例如,当我向www.microsoft.com做一个简单的Web请求时,我想了解它连接的哪个IP地址发送HTTP请求,我想以编程方式(而不是通过Wireshark等)

.net ip dns httpwebrequest

7
推荐指数
2
解决办法
5894
查看次数

处理大字符串,这是大对象堆碎片吗?

我有一个.NET 3.5应用程序

  • 一个功能运行了一百万次
  • 它正在以1MB +字符串(不同大小的字符串)进行搜索和替换以及正则表达式操作

当我对应用程序进行概要分析时,我可以确认这些字符串存储在LOH中,但稍后它们也会被GC回收,因此在给定时间内,只有最多10个字符串在LOH中(10个线程正在运行).

我的理解是,这些大字符串位于LOH,然后由GC回收,但不知何故由于它们的分配位置(并且在LOH中因此没有被压缩)这导致碎片化.尽管操作中没有内存泄漏,但仍会发生这种情况.

它不会导致~100K次出现问题,但是当它达到1M +时会出现内存异常.

我正在使用ANTS Memory Profiler,这是我在早期执行中得到的结果:

.NET Using 70MB of 210MB total private bytes allocated in to the application
Number of Fragments: 59
Number of Large Fragments : 48 (99.6% of free memory)
Largest Fragment: 9MB
Free Space: 52% of total memory  (37MB)
Unmanaged Memory: 66% of total private memory (160MB)
Run Code Online (Sandbox Code Playgroud)
  1. 根据手头的数据,您认为我的诊断是否正确?
  2. 如果是这样,我该如何解决这个LOH碎片问题呢?我必须处理这些字符串,它们是大字符串.我应该找到一种方法将它们分开并像这样处理吗?在这种情况下,在分裂字符串中运行正则表达式等将非常具有挑战性.

.net c# memory-leaks out-of-memory large-object-heap

7
推荐指数
1
解决办法
2235
查看次数

为什么默认情况下不启用PreAuthenticate?

据我所知,WebRequest.PreAuthenticate几乎总是好的.

如果我启用它,即使没有凭据也不会尝试进行身份验证,如果有凭据则会.那么有任何正当理由将其设置为False吗?或者即使没有凭据也可以将其设置为True?

并且因为它非常有用,为什么它没有像许多其他HTTP功能一样默认启用?

.net webrequest httpwebrequest

6
推荐指数
1
解决办法
2812
查看次数