C# 不会被处理的静态变量
我的类中有一个C# 不会被处理的静态变量,c#,memory-management,memory-leaks,dispose,resource-management,C#,Memory Management,Memory Leaks,Dispose,Resource Management,我的类中有一个静态StreamWriter变量: private static StreamWriter streamWriter = CreateStreamWriter(pathToFile); 我不会在我的应用程序中关闭此StreamWriter,因为它需要在应用程序运行时打开 如果我多次启动和停止此应用程序,是否会出现内存泄漏?或者在关闭应用程序时对象是否已正确处理 此类是ASP.NET MVC 4和WPF应用程序都使用的实用程序类 谢谢大家的回复。以下是我添加的代码: 在包含Stre
静态StreamWriter
变量:
private static StreamWriter streamWriter = CreateStreamWriter(pathToFile);
我不会在我的应用程序中关闭此StreamWriter,因为它需要在应用程序运行时打开
如果我多次启动和停止此应用程序,是否会出现内存泄漏?或者在关闭应用程序时对象是否已正确处理
此类是ASP.NET MVC 4和WPF应用程序都使用的实用程序类
谢谢大家的回复。以下是我添加的代码:
在包含StreamWriter的类中:
public static void OnApplicationExit(object sender, EventArgs e)
{
try
{
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
catch { }
}
public static void OnApplicationExit()
{
try
{
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
catch { }
}
在ASP.NET MVC Global.Asax中:
protected void Application_End()
{
Utilities.MyClass.OnApplicationExit();
}
使用using语句,这是最好的方法 使用(var r=新的StreamWriter(,,){
}使用using语句,这是最好的方法 使用(var r=新的StreamWriter(,,){
}应用程序关闭时,不能保证处置
StreamWriter
。有时会,但在某些情况下这是不可能的
没有内存泄漏,因为它使用托管内存。当应用程序关闭时,将删除整个堆
这也不是资源泄漏,因为当应用程序关闭时,打开的文件句柄将被关闭
但是,
StreamWriter
有一个缓冲区,如果它没有被释放,就不会被刷新。这意味着您使用writer编写的最后的内容可能会从文件中丢失。应用程序关闭时,不能保证将StreamWriter
处理掉。有时会,但在某些情况下这是不可能的
没有内存泄漏,因为它使用托管内存。当应用程序关闭时,将删除整个堆
这也不是资源泄漏,因为当应用程序关闭时,打开的文件句柄将被关闭
但是,StreamWriter
有一个缓冲区,如果它没有被释放,就不会被刷新。这意味着您使用writer编写的最后一些内容可能会从文件中丢失。当您说“多次启动并停止此应用程序”时,您的意思是进程退出,并且每次都启动一个新进程吗?当一个进程退出时,它的所有内存都被操作系统回收,因此实际上没有“内存泄漏”
说到这里,我确实觉得在关闭时清理资源是一个好的做法;您可能决定要在同一进程内重新启动。修复泄漏比一开始就没有泄漏要困难得多
假设您必须在关机时执行其他操作,如刷新写入程序。然后,你需要某种在关机时启动的钩子。当你说“多次启动并停止此应用程序”时,你的意思是进程退出并且每次启动一个新进程吗?当一个进程退出时,它的所有内存都被操作系统回收,因此实际上没有“内存泄漏”
说到这里,我确实觉得在关闭时清理资源是一个好的做法;您可能决定要在同一进程内重新启动。修复泄漏比一开始就没有泄漏要困难得多
假设您必须在关机时执行其他操作,如刷新写入程序。然后,您需要某种在关机时启动的钩子。Streamwriter实现IDisposable。因此,如果不调用它的Dispose方法,就无法保证正确地处理了它的资源 在我看来,您有两个基本选择:
using(var writer = new StreamWriter())
{
//do your IO here
}
编辑:您指出您的应用程序是ASP.Net应用程序。对于ASP.Net应用程序,您可以在global.asax的应用程序开始事件中创建静态变量,并在global.asax的应用程序结束事件中处置静态变量。Streamwriter实现IDisposable。因此,如果不调用它的Dispose方法,就无法保证正确地处理了它的资源 在我看来,您有两个基本选择:
using(var writer = new StreamWriter())
{
//do your IO here
}