我想使用IDisposable接口清除内存中没有使用的任何资源.
public class dispose:IDisposable
{
public void Dispose()
{
throw new NotImplementedException();
}
public void fun()
{
PizzaFactory _pz = new PizzaFactory(); //
}
}
Run Code Online (Sandbox Code Playgroud)
我想处理pz
对象,当没有ref它存在时.请让我知道怎么做.
想一想:
StreamReader reader = null;
try
{
reader = new StreamReader(_fileName);
}
catch
{
//show error that file not found
reader.Dispose();
return false;
}
try
{
//code to read file
}
catch
{
//show error badly formed file
}
finally
{
reader.Dispose();
}
//return
Run Code Online (Sandbox Code Playgroud)
当无法打开文件时,上面的代码不起作用,因为它调用Dispose for null导致异常.
我不想使用因为我想分开打开文件和阅读它的问题.这可以通过百万种不同的渔获量实现,但我不想这样做.另外如果使用与try-finally相同,那么"隐藏Dispose"会抛出不需要的异常吗?当我需要的只是捕获异常打开它并读取异常时,这将是最好的方法吗?
谢谢和BR - 马蒂
我一直在开发一个非常大的应用程序,几天前我将它上传到我的服务器.现在我发现它有几个内存泄漏 - 哦哦.我的服务器在1GB内存上运行Windows Server 2008.当我在线有0人时,只使用550-600mb.当一个人上线时,内存开始暴涨,如果3-4人在线,则使用1GB内存.
该应用程序是在ASP.NET中使用AJAX进行的.它有许多每秒运行的更新面板和相当多的javascript.它始终使用5-7个会话.我使用LINQ to SQL作为数据库通信.
我在服务器上尝试过perfmon.exe,我发现:
我还用Visual Studio对我的程序进行了分析.我的总运行时间的8%是在.ToList()方法中完成的,这正是由LINQ to SQL引起的.
我的理论......
(1)Linq to SQL dataContext
这可能是一个疯狂的事情,但是:在我的数据访问层中,我有很多方法:
其中每个都有以下初始化:
GameDataContext db = new GameDataContext();
Run Code Online (Sandbox Code Playgroud)
这意味着上述陈述几乎每秒或更长时间.
(2)没有对象实现IDisposable
我必须诚实:我从未使用过IDisposable.据我所知,这可能是个问题.
另外,如果这是泄漏,哪些类应该实现呢?我没有任何I/O工作或其他工作,只有DataContext.
(3)UpdatePanels和jQuery的负载
我有一些担心更新面板可能会给性能带来问题,但我不知道如何检查它.
所以我的问题是:关于内存泄漏可能是什么的任何想法?有关如何查找内存泄漏的任何想法?关于如何解决它的任何想法?
我很想听到有上述情况经验的人的来信!
谢谢,拉尔斯
所以我一直在使用System.Net.Mail.MailMessage
对象发送电子邮件SmtpClient
一段时间了.我注意到某处MailMessage
实现了IDisposable
,所以我总是在一个using
块中使用它.
using(MailMessage msg = new MailMessage())
{
msg.To = blah... etc;
...
smtpclient.Send(msg);
}
Run Code Online (Sandbox Code Playgroud)
从元数据中,您可以看到有关实现的信息 MailMessage
// Summary:
// Releases all resources used by the System.Net.Mail.MailMessage.
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public void Dispose();
//
// Summary:
// Releases the unmanaged resources used by the System.Net.Mail.MailMessage
// and optionally releases the managed resources.
//
// Parameters:
// disposing:
// true to release both …
Run Code Online (Sandbox Code Playgroud) 所以,我之前从未做过一个相当大的WPF项目,但这个让我感到疑惑; 怎么了WPF类没有实现IDisposable
?相比之下,Windows窗体中的所有UI元素都实现了IDisposable
,以确保它们摆脱了底层句柄等.
我认为那里有相同的Windows对象,这些资源必须被释放; 那么,WPF是如何做到的呢?
除了Close()
它们之外,还有什么我需要做的WPF Window对象吗?
你有没有办法建议帮助摆脱调用Initialize()和Close()方法并将其替换为使用块?
或者这种方法完全没问题?
(想法是确保当FooWriter的消费者写下一些字符串并完成此操作时将处理Writer.)
class Program
{
static void Main(string[] args)
{
var writer = new FooWriter();
writer.Initialize();
foreach (var s in args)
writer.Write(s);
writer.Cose();
}
public class FooWriter
{
public StreamWriter Writer;
public void Initialize()
{
Writer = new StreamWriter("MyFile.txt", false);
}
public void Write(string line)
{
if(Writer==null)
throw new NullReferenceException(Writer, "Writer"); // Guard Writer
Writer.WriteLine(line);
}
public void Close()
{
Writer.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
什么是C#使用块,为什么要使用它?
如果我运行以下代码:
using (SPWeb web = SPContext.Current.Site.OpenWeb("/myweb")){
//error happens here
}
Run Code Online (Sandbox Code Playgroud)
如果在结束括号之前发生错误web
,是否会正确处理对象?
我们被告知使用对象的using
语句OpenWeb
是最好的,但
我们在日志中看到很多关于SPRequests和SPWeb的错误.
如何实现处理一个类,它有对象作为不实现IDisposable的成员?
请参考下面的例子来了解我的意思:
Public Class MyClass
Implements IDisposable
private emp as EmpClass
private dept as DeptClass
' EmpClass and DeptClass doesn't implemented IDisposable interface.
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
emp = Nothing ' --> Can't call Dispose method so I set to null
dept = Nothing ' --> Can't call Dispose method so I set to null
End If
End If
Me.disposedValue = True
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
从上面看,所有都是托管对象,我可以做必要的更新.所以请建议那个代码好.
编辑
当我试图创建一个MyClass实例时,编译器给了我一个错误,我必须实现IDisposable.以下是我的通话代码. …
当创建一个实现一个元素IDisposable
,Dispose()
是在结束所谓的using
块还,如果抛出一个异常,如果我是正确的.
但是,在ClassB
一次性元素的构造函数中创建新元素时,如果IDisposable
实现了ClassB的对象,是否也会被处置?
using (ClassA a = new ClassA(new ClassB()))
{
}
Run Code Online (Sandbox Code Playgroud)
这可能适用于与之相关的类Stream
.但是,这一般适用吗?
我有一个using
块IDisposable DirectoryEntry
来创建目录条目,访问其中一个属性,然后处置它.但是,目录条目在使用块结束之前被处理.
public static PropertyValueCollection GetProperty(
this Principal principal, string propertyName)
{
using (var directoryEntry = principal.GetAsDirectoryEntry())
{
return directoryEntry.Properties[propertyName];
}
}
public static DirectoryEntry GetAsDirectoryEntry(
this Principal principal)
{
return principal.GetUnderlyingObject() as DirectoryEntry;
}
Run Code Online (Sandbox Code Playgroud)
该错误被抛出return directoryEntry.Properties[propertyName];
,表示该目录条目已被释放.我可以删除使用块,代码将工作,但我担心该对象永远不会被处置.我多次调用它,因此创建目录条目的多个实例并且从未处理过?
idisposable ×10
.net ×6
c# ×5
dispose ×2
using ×2
asp.net ×1
c#-2.0 ×1
file-io ×1
linq-to-sql ×1
mailmessage ×1
memory-leaks ×1
spweb ×1
streamwriter ×1
updatepanel ×1
vb.net ×1
wpf ×1