在下面的示例中,如果在using语句中抛出异常,连接是否会关闭并释放?using(varconn=newSqlConnection("...")){conn.Open();//stuffhappenshereandexceptionisthrown...}我知道下面的这段代码将确保它确实如此,但我很好奇using语句是如何做到的。varconn;try{conn=newSqlConnection("...");conn.Open();//stuffhappenshereandexceptionisthrown...}//catchitorletitbubbleupfinally{con
我对如何管理SmtpClient有点困惑,因为它是一次性的,尤其是当我使用SendAsync进行调用时。据推测,在SendAsync完成之前我不应该调用Dispose。但是我应该调用它吗(例如,使用“使用”)。该场景是一个WCF服务,它会在调用时定期发送电子邮件。大多数计算速度很快,但发送电子邮件可能需要一秒钟左右的时间,因此异步会更可取。每次发送邮件时都应该创建一个新的SmtpClient吗?我应该为整个WCF创建一个吗?帮助!更新如果有所不同,每封电子邮件始终是为用户定制的。WCF托管在Azure上,Gmail用作邮件程序。 最佳答案
我有以下代码using(MemoryStreamms=newMemoryStream()){//codereturn0;}dispose()方法在using语句大括号结束时调用,对吗?由于我在using语句结束之前return,MemoryStream对象是否会被正确处理?这里发生了什么? 最佳答案 是的,Dispose将被调用。一旦执行离开using的范围,它就会被调用block,不管用什么方式离开block,block执行结束,return语句或异常。正如@Noldorin正确指出的那样,使用using代码块被编译成try/fi
我想触发一个任务在后台线程上运行。我不想等待任务完成。在.net3.5中我会这样做:ThreadPool.QueueUserWorkItem(d=>{DoSomething();});在.net4中,TPL是建议的方式。我看到推荐的常见模式是:Task.Factory.StartNew(()=>{DoSomething();});然而,StartNew()方法返回Task实现IDisposable的对象。这个似乎被推荐这种模式的人忽略了。Task.Dispose()上的MSDN文档方法说:"AlwayscallDisposebeforeyoureleaseyourlastreferen
Stream、StreamReader、StreamWriter等类实现了IDisposable接口(interface)。这意味着,我们可以在这些类的对象上调用Dispose()方法。他们还定义了一个名为Close()的public方法。现在让我感到困惑的是,一旦我处理完对象后我应该调用什么?如果我同时调用两者怎么办?我目前的代码是这样的:using(StreamresponseStream=response.GetResponseStream()){using(StreamReaderreader=newStreamReader(responseStream)){using(Str
在(潜在的)空对象上使用using语句是否安全?考虑以下示例:classTest{IDisposableGetObject(stringname){//returnsnullifnotfound}voidDoSomething(){using(IDisposablex=GetObject("invalidname")){if(x!=null){//etc...}}}}是否保证仅当对象不为null时才会调用Dispose,并且我不会得到NullReferenceException? 最佳答案 是的,Dispose()仅在非空对象上调用
C#2008我已经研究了一段时间了,但我仍然对在代码中使用finalize和dispose方法感到困惑。我的问题如下:我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现IDisposable以允许该类的客户端使用'using陈述'?实现IDisposable只是为了使您的类的客户端能够使用using语句是否可行?using(myClassobjClass=newmyClass()){//Dostuffhere}我在下面开发了这个简单的代码来演示Finalize/d
前几天,当我意识到我对清理资源几乎一无所知时,我正在尝试消除应用程序中的一些内存泄漏的方法。我做了一些研究,希望只调用.dispose()就能解决我所有的问题。我们的数据库中有一个表,其中包含大约65,000条记录。显然,当我从数据适配器填充数据集时,内存使用率会变得非常高。当我在数据集上调用dispose方法时,我惊讶地发现没有释放内存。为什么会这样?清除数据集也无济于事。 最佳答案 IDisposable因此Dispose不用于减少内存压力,尽管在某些情况下可能会,而是用于确定性清理。考虑到这一点,您构建了一个对象,该对象与您的
我使用AllocMem/GetMem/New例程分配内存,然后使用FreeMem/Dispose例程释放内存。但是我发现(通过ProcessExplorer)进程的内存大小没有减少。如果我使用GlobalAllocPtr/HeapAlloc和GlobalFreePtr/HeapFreeAPI,内存大小会减少。这是我的测试代码:typeTMyRec=recordName:string;TickCount:Cardinal;Buf:array[0..1024-1]ofbyte;end;PMyRec=^TMyRec;varForm1:TForm1;implementation{$R*.dfm
这个问题在这里已经有了答案:WilltheGarbageCollectorcallIDisposable.Disposeforme?(9个回答)关闭8年前.我认为如果您的程序没有调用Dispose,GC最终会调用Dispose,但您应该在程序中调用Dispose()只是为了使清理具有确定性。但是,从我的小测试程序中,我根本没有看到Dispose被调用....publicclassTest:IDisposable{staticvoidMain(string[]args){Tests=newTest();s=null;GC.Collect();Console.ReadLine();}pub