我有一个ASP.NET C#单例(通过HttpContext.Current.Session监视到会话),该单例接收来自代码的消息(警告,错误,异常等)。消息与代码问题有关,主要在调试时使用,而不是在生产期间使用。
我为此对象编写了自定义析构函数,以便将其内容作为文件写入/追加到磁盘上。
我想问与这种情况有关的两件事:
a]在对象析构函数期间打开文件并写入文件是一个好主意吗?并发IO访问通过静态锁定进行处理。
b]何时在会话范围内的对象中调用析构函数?它仅在服务器上的会话过期时使用吗?
我还建议使用一些现有的日志记录程序包。如果您决定自己做,并为未来着想:
a)不,这不是一个好主意。您不应该访问终结器(析构函数)中的托管资源,因此,例如,如果内存中有一些日志字符串,则访问它们(或它们所包含的列表)是一种不好的做法,因为它们可能已经在自己处完成了终结。这点。
我不想重复推荐的模式,因此请参见https://stackoverflow.com/a/1943856/2586804
您将看到只有一个地方应该在Dispose
此期间访问受管理的地方,这是由用户代码而不是GC调用的地方。因此,这应该可以帮助您得出结论,要实现此目标,您必须调用.Dispose()
自己(或使用using
),就像GC在何时(如果使用)那样,它无法访问包含日志行的受管成员。
b)不知道,但是没关系,因为您无论如何都不能为此使用finalizer。
最重要的是,您不能依靠GC来为您运行代码。这是不好的做法,因为您不知道何时会发生该事件,再加上现在或将来对该对象的任何引用,都将阻止该对象的收集并引入错误。
您也不应该让c#终结器/析构函数来运行代码,因为这不是它们的用途,它们是用于释放不受管资源的,以便机器不会耗尽。请注意,在C#中很少使用它们,因为大多数人的日常工作都是托管对象。
取而代之的是显式地告诉对象写它的日志,一个叫做的方法Flush
将是一个好名字。或者只是让它一次只写一行。这将是通常的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句