2014-09-05 24 views
1

请考虑使用.Net 2003 Framework的以下代码。将处理一个具有线程启动的线程的对象,无需调用Thread.Abort()

' 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()

+2

这就要看在这个对象中实现'Dispose'方法,它不是“自动的”或任何东西,当然这可能会导致麻烦 – Luaan 2014-09-05 14:44:02

+0

听起来像是答案。谢谢! – bitsoflogic 2014-09-05 14:46:00

+1

我不确定运行时的* exact *行为如果你在一个被引用的方法在另一个线程中运行的时候抛弃了一个对象,那么我的* guess *就是这个线程会抛出一个异常,这会导致异常终止,但是,它不是一个记录过程。另外,直接调用Abort并不是一个好主意,因为行为可能是不稳定的,也不是保证。 – James 2014-09-05 14:50:06

回答

1

您的代码:

Public Sub startThread() 
    Dim t As New System.Threading.Thread(AddressOf someObject.someSub) 
    t.Start() 
End Sub 

你得到到恰好是someObject子程序的参考。 someObject将无法知道此方法已被称为对象外的辅助线程。正因为如此,你将被迫自己停止线程。中止是大锤。如果someSub编写正确,应该有一种方法使线程优雅地退出,然后不需要中止。

Public Sub Dispose() Implements IDisposable.Dispose 
    someObject.Dispose() 
End Sub 

因为someObject是不负责在创建线程(它有作为一个线程的方法之一),它不承担其终止责任。所以在设计模式中,您有someObject.Dispose()将无法​​终止线程。你必须自己做。

如果你有能力改变一些类,一个适当的设计模式将是创建一个新的方法,如startThreadt将是someClass中的成员变量。 startThread反过来会做这样的事情:

t = New System.Threading.Thread(AddressOf Me.someSub) 
t.Start() 

现在SomeClass的负责创建线程,所以SomeClass的的Dispose方法,你会尝试停止线程(希望比中止更有风度