Public Class Counter
Private context As Threading.SynchronizationContext = Threading.SynchronizationContext.Current
Public Event CountChanged As EventHandler(Of CountChangedEventArgs)
Protected Overridable Sub OnCountChanged(ByVal e As CountChangedEventArgs)
RaiseEvent CountChanged(Me, e)
End Sub
Public Sub CountAsync(ByVal paso As Integer)
ThreadExtensions.QueueUserWorkItem(New Func(Of Integer, String)(AddressOf Count), paso)
End Sub
Public Sub CountAsync2(ByVal paso As Integer)
ThreadExtensions.QueueUserWorkItem(New Func(Of Integer, String)(AddressOf Count), paso)
End Sub
Public Function Count(ByVal paso As Integer) As String
' Dim startTime As DateTime = DateTime.Now
Dim e As CountChangedEventArgs
For i = 0 To paso
e = New CountChangedEventArgs(i, paso)
Select Case i
Case 0
If context Is Nothing Then
OnCountChanged(e)
Else
ThreadExtensions.ScSend(context, New Action(Of CountChangedEventArgs)(AddressOf OnCountChanged), e)
End If
Threading.Thread.Sleep(2000)
Case 2
If context Is Nothing Then
OnCountChanged(e)
Else
ThreadExtensions.ScSend(context, New Action(Of CountChangedEventArgs)(AddressOf OnCountChanged), e)
End If
Threading.Thread.Sleep(200)
End Select
Next
' Return "Count took : " + (DateTime.Now - startTime).ToString
End Function
End Class
Public Class CountChangedEventArgs
Inherits EventArgs
Private _NumeroThread As Integer
Private _Paso As Integer
Public Sub New(ByVal nc As Integer, ByVal paso As Integer)
_NumeroThread = nc
_Paso = paso
End Sub
Public ReadOnly Property NumeroThread() As Integer
Get
Return _NumeroThread
End Get
End Property
Public ReadOnly Property Paso() As Integer
Get
Return _Paso
End Get
End Property
End Class
Public Class ThreadExtensions
Private args() As Object
Private DelegateToInvoke As [Delegate]
Public Shared Function QueueUserWorkItem(ByVal method As [Delegate], ByVal ParamArray args() As Object) As Boolean
Return Threading.ThreadPool.QueueUserWorkItem(AddressOf ProperDelegate, New ThreadExtensions With {.args = args, .DelegateToInvoke = method})
End Function
Public Shared Sub ScSend(ByVal sc As Threading.SynchronizationContext, ByVal del As [Delegate], ByVal ParamArray args() As Object)
sc.Send(New Threading.SendOrPostCallback(AddressOf ProperDelegate), New ThreadExtensions With {.args = args, .DelegateToInvoke = del})
End Sub
Private Shared Sub ProperDelegate(ByVal state As Object)
Dim sd As ThreadExtensions = DirectCast(state, ThreadExtensions)
sd.DelegateToInvoke.DynamicInvoke(sd.args)
End Sub
End Class