C#单例日志类,在销毁磁盘上存储消息

活到老学到老

我有一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

抽象类单例C#

来自分类Dev

C#单例字典类

来自分类Dev

C#调用C ++基于单例类的dll

来自分类Dev

C#调用C ++基于单例类的dll

来自分类Dev

静态类中的C#单例模式?

来自分类Dev

C#单例模式

来自分类Dev

静态对象与单例类对象在C ++?

来自分类Dev

C#-尝试创建单例类

来自分类Dev

C ++ / CLI和C#单例

来自分类Dev

单例(C#)的通用抽象基类-无法实例化私有Lazy实例

来自分类Dev

C#单例线程安全变量

来自分类Dev

单例类崩溃

来自分类Dev

为什么 C# 单例类有时会在多线程中调用两个方法?

来自分类Dev

libSpatialIndex:磁盘上的加载/存储索引

来自分类Dev

数据如何存储在磁盘上?-EFI GUID

来自分类Dev

CouchDB中的视图如何存储在磁盘上?

来自分类Dev

标记UNIX进程/在磁盘上存储pid?

来自分类Dev

图像存储在磁盘上-按名称搜索

来自分类Dev

如何从其他类访问单例C ++

来自分类Dev

如何在C ++中创建简单的单例类?

来自分类Dev

单例类滥用,C ++-需要说明

来自分类Dev

密封类和单例

来自分类Dev

单例方法与类方法

来自分类Dev

在C#中将单例定义移入mixins

来自分类Dev

C#单例课程运行良好确认

来自分类Dev

如何在C#中实现单例设计模式?

来自分类Dev

使用序列化C#打破单例

来自分类Dev

首选项vs单例类可将数据集中存储在android中

来自分类Dev

XCode服务器在磁盘上的构建日志位置