使用.Net 2003 Framework考虑以下代码。
' This gets initialized in New() perhaps...
Private someObject As SomeClass
Public Sub startThread()
Dim t As New System.Threading.Thread(AddressOf someObject.someSub)
t.Start()
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
someObject.Dispose()
End Sub
someObject.Dispose()是否会有效地消除调用t.Abort()
?
答案 0 :(得分:1)
您的代码:
Public Sub startThread()
Dim t As New System.Threading.Thread(AddressOf someObject.someSub)
t.Start()
End Sub
您正在获取某个恰好位于someObject中的子例程的引用。 someObject无法知道此方法已被调用为对象外部的工作线程。因此,你将被迫自己停止线程。 Abort是一把大锤。如果someSub写得正确,应该有一种方法可以让线程正常退出,然后就不需要中止了。
Public Sub Dispose() Implements IDisposable.Dispose
someObject.Dispose()
End Sub
因为someObject不负责创建线程(它的一个方法用作线程),所以它在终止时不承担责任。因此,在设计模式中,您someObject.Dispose()
无法终止该线程。你必须自己做。
如果你能够改变someClass,那么正确的设计模式就是创建一个像startThread
这样的新方法。 t
将是someClass中的成员变量。 startThread反过来会做类似的事情:
t = New System.Threading.Thread(AddressOf Me.someSub)
t.Start()
现在someClass负责创建线程,所以在someClass的Dispose方法中你会尝试停止线程(希望比Abort更有优势。