读书人

VB.NET并行与分布式编程(六)-线程与内

发布时间: 2012-08-30 09:55:54 作者: rapoo

VB.NET并行与分布式编程(6)-线程与内核同步[8]

2)我们可以用更好的方式使用.NET的委托和线程池

A)委托

?WaitCallback 委托,表示线程池线程要执行的回调方法。

?

WaitCallback 表示要在 ThreadPool 线程上执行的回调方法。 创建委托,方法是将回调方法传递给 WaitCallback 构造函数。 您的方法必须具有此处所显示的签名。

通过将 WaitCallback 委托传递给 ThreadPool.QueueUserWorkItem 来将任务排入队列以便执行。 您的回调方法将在某个线程池线程可用时执行。

如果要将信息传递给回调方法,请创建包含所需信息的对象,并在将任务排入队列以便执行时将它传递给 QueueUserWorkItem。 每次执行您的回调方法时,state 参数都包含此对象。

B)线程池

ThreadPool 类提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

?

?D)分析

1.参数类中增加了threadname ,存放线程名称,因为

调用 QueueUserWorkItem 方法。 此方法将对将被从线程池中选定的线程调用的方法或委托的引用用作参数。 一个工作项排入队列后就无法再取消它。并且没有提供直接指定线程池被调用的线程的名字的办法

?

??? Public Class CalculateIfno
??????? Private _threadevent As AutoResetEvent
??????? Private _result As Long
??????? Private _threadname As String
??????? Public Property threadevent As AutoResetEvent
??????????? Get
??????????????? Return _threadevent
??????????? End Get
??????????? Set(ByVal value As AutoResetEvent)
??????????????? _threadevent = value
??????????? End Set
??????? End Property
??????? Public Property result As Long
??????????? Get
??????????????? Return _result
??????????? End Get
??????????? Set(ByVal value As Long)
??????????????? _result = value
??????????? End Set
??????? End Property
??????? Public Property threadname As String
??????????? Get
??????????????? Return _threadname
??????????? End Get
??????????? Set(ByVal value As String)
??????????????? _threadname = value
??????????? End Set
??????? End Property
??? End Class

2.QueueUserWorkItem方法

QueueUserWorkItem(WaitCallback)将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。QueueUserWorkItem(WaitCallback,?Object)将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。 calculateifno(i)这个参数类对象被传入队列
??????? '设置线程执行前相关参数,并执行线程,将参数对象传入线程
??????? For i = 0 To threadevent.GetUpperBound(0)
??????????? '设置参数对象
??????????? threadevent(i) = New AutoResetEvent(False)
??????????? calculateifno(i) = New CalculateIfno
??????????? calculateifno(i).threadevent = threadevent(i)
??????????? calculateifno(i).result = 0
??????????? calculateifno(i).threadname = i & "号线程"
??????????? '在线程池中加入线程,将参数对象传入线程执行
??????????? mywaitcallback(i) = New WaitCallback(AddressOf mythreadrun)
??????????? ThreadPool.QueueUserWorkItem(mywaitcallback(i), calculateifno(i))
??????? Next

读书人网 >编程

热点推荐