vb.net下如何销毁类的实例
各位看官先看如下代码,非常简单:
因为Form1_Load里创建的class1类的实例是过程内的私有成员,为了以后销毁,所以存在一个集合中,这时,每秒会 debug 出:时间 + “第1个类”;
当在Button1_Click里在创建一个class1类的实例里,想让Form1_Load中创建的那个类销毁,试过nothing,集合的remove,甚至Dispose(Dispose不是这段代码),每秒会 debug 出:时间 + “第1个类”,换行,+时间 + “第2个类”,说明第一个类的实例实际还在运行中;
有人提议在Dispose中将class1的t销毁,时间 + “第1个类”是不出现了,但这从理论上实际上只是将第一个实例的对象t销毁了,第一个实例仍然存在!
请问,vb.net下如何销毁类的实例?!
Public Class Form1
Public bb As New SortedList
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim class1 As New Class1("第1个类")
bb.Add(0, class1)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim class1 As New Class1("第2个类")
Dim t As Class1 = bb.Item(0)
't.Dispose()
't = Nothing
'bb.Remove(0)
bb.Add(0, class1)
End Sub
End Class
Public Class Class1
Public aa As String
Public WithEvents t As New Timer
Sub New(ByVal value As String)
aa = value
t.Interval = 1000
t.Start()
End Sub
Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles t.Tick
Debug.WriteLine(Now.ToString & "---->" & aa)
End Sub
End Class
因为Form1_Load里创建的class1类的实例是过程内的私有成员,为了以后销毁,所以存在一个集合中,这时,每秒会 debug 出:时间 + “第1个类”;
当在Button1_Click里在创建一个class1类的实例里,想让Form1_Load中创建的那个类销毁,试过nothing,集合的remove,甚至Dispose(Dispose不是这段代码),每秒会 debug 出:时间 + “第1个类”,换行,+时间 + “第2个类”,说明第一个类的实例实际还在运行中;
有人提议在Dispose中将class1的t销毁,时间 + “第1个类”是不出现了,但这从理论上实际上只是将第一个实例的对象t销毁了,第一个实例仍然存在!
请问,vb.net下如何销毁类的实例?!
...全文
请发表友善的回复…
发表回复
足球中国 2009-11-17
- 打赏
- 举报
析构函数,与idispose接口。
托管代码的销毁是由.net框架自己销毁。
每次销毁都会挂起你的程序的所有线程。这中间的平衡是由ms决定的。
托管代码的销毁是由.net框架自己销毁。
每次销毁都会挂起你的程序的所有线程。这中间的平衡是由ms决定的。
一只熊猫 2009-11-17
- 打赏
- 举报
期待楼主来讲解!
zqtoo 2009-11-17
- 打赏
- 举报
[Quote=引用 1 楼 ahsun1987 的回复:]
不懂VB还是帮你顶!
[/Quote]
ding
不懂VB还是帮你顶!
[/Quote]
ding
oo渣渣oo 2009-11-17
- 打赏
- 举报
关键是在类里面要有这一句Implements IDisposable
而且要放在Public Class Class1下面一行
而且要放在Public Class Class1下面一行
sxmonsy 2009-11-17
- 打赏
- 举报
执行完断开操作后Dispose()难道不行???
ineedchrist 2009-11-17
- 打赏
- 举报
问题经过自己的尝试已经解决,楼上说的都不对,我下午上班发帖子说明。
ineedchrist 2009-11-17
- 打赏
- 举报
[Quote=引用 10 楼 wjq 的回复:]
确保没有任何地方再调用你的类,包括你的监控代码。然后让GC执行回收。
[/Quote]
你这种做法是肯定不行的。从理论上来讲,一个类,无论我实例多少,我应该可以自由的销毁其中的任意一个实例,以节约资源。
我的实际应用是,我要管理上万个TCP联接,我将TCP有关的方法封装后,当设备端进行联接后,我会创建一个实例,当设备断开后,我要销毁它,如果不销毁,几万个设备不断的建联接然后断开,系统的资源开销会越来越大,你的“没有任何地方调用”是不合理的。
确保没有任何地方再调用你的类,包括你的监控代码。然后让GC执行回收。
[/Quote]
你这种做法是肯定不行的。从理论上来讲,一个类,无论我实例多少,我应该可以自由的销毁其中的任意一个实例,以节约资源。
我的实际应用是,我要管理上万个TCP联接,我将TCP有关的方法封装后,当设备端进行联接后,我会创建一个实例,当设备断开后,我要销毁它,如果不销毁,几万个设备不断的建联接然后断开,系统的资源开销会越来越大,你的“没有任何地方调用”是不合理的。
ineedchrist 2009-11-17
- 打赏
- 举报
自己动手做的实验已经发到博客里了,http://blog.csdn.net/ineedchrist/archive/2009/11/17/4821528.aspx
wjq 2009-11-16
- 打赏
- 举报
确保没有任何地方再调用你的类,包括你的监控代码。然后让GC执行回收。
ineedchrist 2009-11-16
- 打赏
- 举报
[Quote=引用 7 楼 wjq 的回复:]
你不要用这个类了,你的那个集合就把这个类Remove掉,其他用到这个类的地方,集合就Remove/Clear,变量就=nothing,反正保证你代码里没地方再用到它了
[/Quote]
没看明白你的意思!
你不要用这个类了,你的那个集合就把这个类Remove掉,其他用到这个类的地方,集合就Remove/Clear,变量就=nothing,反正保证你代码里没地方再用到它了
[/Quote]
没看明白你的意思!
ineedchrist 2009-11-16
- 打赏
- 举报
[Quote=引用 6 楼 wuyq11 的回复:]
t = Nothing
在Class1中实现dispose
Public Class A
Implements IDisposable
Public Sub Dispose()
Dispose(True)
GC.SuppressFinally(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
End If
End Sub
Protected Overrides Sub Finalize()
Try
Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub
End Class
[/Quote]
你这个写的,和我四楼写的有什么区别呀?
t = Nothing
在Class1中实现dispose
Public Class A
Implements IDisposable
Public Sub Dispose()
Dispose(True)
GC.SuppressFinally(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
End If
End Sub
Protected Overrides Sub Finalize()
Try
Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub
End Class
[/Quote]
你这个写的,和我四楼写的有什么区别呀?
wjq 2009-11-16
- 打赏
- 举报
你不要用这个类了,你的那个集合就把这个类Remove掉,其他用到这个类的地方,集合就Remove/Clear,变量就=nothing,反正保证你代码里没地方再用到它了
wuyq11 2009-11-16
- 打赏
- 举报
t = Nothing
在Class1中实现dispose
Public Class A
Implements IDisposable
Public Sub Dispose()
Dispose(True)
GC.SuppressFinally(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
End If
End Sub
Protected Overrides Sub Finalize()
Try
Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub
End Class
在Class1中实现dispose
Public Class A
Implements IDisposable
Public Sub Dispose()
Dispose(True)
GC.SuppressFinally(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
End If
End Sub
Protected Overrides Sub Finalize()
Try
Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub
End Class
ineedchrist 2009-11-16
- 打赏
- 举报
[Quote=引用 3 楼 wjq 的回复:]
你有地方引用,还不停访问~垃圾回收就不会去回收这个类……不要加入集合,用完把所有变量都设为nothing,然后执行GC.Collect()来回收。
另外,变量只是一个指向类所在内存的指针,设为nothing是不会销毁类的,只是取消指向而已。当所有对类的引用都消失的时候,GC就会定期回收他所占资源。
[/Quote]
第一个类的实例是在form_load里定义的,是个过程级的变量,我需要他生存一段时间,在我想销毁的时候在销毁,过程外,我怎么置为nothing?
你有地方引用,还不停访问~垃圾回收就不会去回收这个类……不要加入集合,用完把所有变量都设为nothing,然后执行GC.Collect()来回收。
另外,变量只是一个指向类所在内存的指针,设为nothing是不会销毁类的,只是取消指向而已。当所有对类的引用都消失的时候,GC就会定期回收他所占资源。
[/Quote]
第一个类的实例是在form_load里定义的,是个过程级的变量,我需要他生存一段时间,在我想销毁的时候在销毁,过程外,我怎么置为nothing?
ineedchrist 2009-11-16
- 打赏
- 举报
试验Dispose的代码
Public Class Class1
Implements IDisposable
Protected disposed As Boolean = False
Public aa As String
Public WithEvents t As New Timer
Sub New(ByVal value As String)
aa = value
t.Interval = 1000
t.Start()
End Sub
Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles t.Tick
Debug.WriteLine(Now.ToString & "---->" & aa)
End Sub
Protected Overridable Overloads Sub Dispose( _
ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
t.Dispose() '时钟对象是销毁了,但是这个类的实例也同时销毁了吗?
End If
End If
Me.disposed = True
End Sub
Public Sub AnyOtherMethods()
If Me.disposed Then
Throw New ObjectDisposedException(Me.GetType().ToString, "This object has been disposed.")
End If
End Sub
#Region " IDisposable Support "
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
#End Region
End Class
wjq 2009-11-16
- 打赏
- 举报
你有地方引用,还不停访问~垃圾回收就不会去回收这个类……不要加入集合,用完把所有变量都设为nothing,然后执行GC.Collect()来回收。
另外,变量只是一个指向类所在内存的指针,设为nothing是不会销毁类的,只是取消指向而已。当所有对类的引用都消失的时候,GC就会定期回收他所占资源。
另外,变量只是一个指向类所在内存的指针,设为nothing是不会销毁类的,只是取消指向而已。当所有对类的引用都消失的时候,GC就会定期回收他所占资源。
ineedchrist 2009-11-16
- 打赏
- 举报
[Quote=引用 1 楼 ahsun1987 的回复:]
不懂VB还是帮你顶!
[/Quote]
我靠,你的头像和我的QQ头像一模一样,太有缘了!
不懂VB还是帮你顶!
[/Quote]
我靠,你的头像和我的QQ头像一模一样,太有缘了!
Taiyangchen 2009-11-16
- 打赏
- 举报
不懂VB还是帮你顶!