将处理在其方法上启动了线程的对象将删除调用Thread.Abort()的需要

时间:2014-09-05 14:37:48

标签: .net

使用.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()

的需要

1 个答案:

答案 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更有优势。