Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > .NET General

Vista - VB using WaitHandles

Reply
 
Old 06-05-2009   #1 (permalink)
Anthony Lopez


 
 

VB using WaitHandles



I attempted to test how waithandles and autoresetevents work with one
another in hopes to be able to use them in my application. However, I keep
hitting the wall.

Can some one look over the attached code and tell me what I am doing wrong.
I am getting the following errors:

C:\Development\Net\VB\TestThread\TestThread\bin>testthread
Waiting for all current task to complete
Task Id = 1 Sequence = 1
Task Run Id = 10 Task Mode = True

Task Id = 2 Sequence = 1
Task Run Id = 10 Task Mode = True

Task Id = 3 Sequence = 1
Task Run Id = 10 Task Mode = True


Unhandled Exception: System.NullReferenceException: Object reference not set
to
an instance of an object.
at System.Threading.WaitHandle.WaitMultiple(WaitHandle[] waitHandles,
Int32 m
illisecondsTimeout, Boolean exitContext, Boolean WaitAll)
at System.Threading.WaitHandle.WaitAll(WaitHandle[] waitHandles, Int32
millis
econdsTimeout, Boolean exitContext)
at System.Threading.WaitHandle.WaitAll(WaitHandle[] waitHandles)
at TestThread.TestThread.Main() in
C:\Development\Net\VB\TestThread\TestThrea
d\Module1.vb:line 48

What's odd about this is that I closely follows the example in Microsoft's
MSDN web site.

' File: TestThread.vb

Option Strict On
Option Explicit On

Imports System
Imports System.Console
Imports System.io
Imports System.Threading
Imports System.Threading.Thread



Module TestThread

Const MAXTASK As Integer = 5
Const MAXTHREAD As Integer = 25

<MTAThreadAttribute()> _
Sub Main()

Dim Tasks As New ArrayList
Dim RunTask As CTask

Dim iRunTaskId As Integer = 10
Dim bRunTaskMode As Boolean = True

Dim Sync(3) As AutoResetEvent

'Create an array used to define the task's Id and Sequence
Dim TaskDefn(,) As Integer = New Integer(,) {{1, 1}, {2, 1}, {3, 1},
{4, 2}, {5, 3}}

' Create all the task using the TaskDefn array
For i As Integer = 0 To MAXTASK - 1
Dim theTask As CTask = New CTask
theTask.Id = TaskDefn(i, 0)
theTask.Sequence = TaskDefn(i, 1)
Tasks.Add(theTask)
Next i

Dim iSeq As Integer = 1000
Dim iTask As Integer = 0

For Each RunTask In Tasks

If iSeq < RunTask.Sequence Then
Console.WriteLine("Waiting for all current task to
complete")
WaitHandle.WaitAll(Sync) ' <<< THIS IS THE ERROR LINE
Console.WriteLine("All task have completed")
iTask = 0
End If

iSeq = RunTask.Sequence

Sync(iTask) = New AutoResetEvent(False)

Dim TaskParam As New CTaskParam(RunTask, bRunTaskMode,
iRunTaskId, Sync(iTask))

Try
ThreadPool.QueueUserWorkItem(AddressOf cbStartProgram,
TaskParam)
Catch ex As Exception
Console.WriteLine("Main Error Message: " + vbCrLf +
ex.Message)
End Try

iTask += iTask

Next

Sleep(3000)
End Sub

Class CTaskParam
Public Task As CTask
Public Mode As Boolean
Public RunId As Integer
Public SignalWhenDone As AutoResetEvent

Sub New(ByVal TaskParam As CTask, ByVal ModeParam As Boolean, ByVal
RunIdParam As Integer, ByVal SignalParam As AutoResetEvent)
Me.Task = TaskParam
Me.Mode = ModeParam
Me.RunId = RunIdParam
Me.SignalWhenDone = SignalParam
End Sub


End Class

' This module represent an intermediary module used to create a thread
and process
' the parameters, eventually invokeing the actual object/module
Sub cbStartProgram(ByVal theTaskParam As Object)

' Get the arguments
Dim TaskParam As CTaskParam = CType(theTaskParam, CTaskParam)

Try
' Invoke the object
TaskParam.Task.Run(TaskParam.RunId, TaskParam.Mode)
Catch ex As Exception
Console.WriteLine("Start Program - Error Message: " + vbCrLf +
ex.Message)
Finally
TaskParam.SignalWhenDone.Set()
End Try

End Sub


End Module



' This Class represents any task that can be call from .Net
'
Class CTask

Dim iSequence As Integer
Dim iId As Integer


Property Sequence() As Integer
Get
Return iSequence
End Get
Set(ByVal Value As Integer)
iSequence = Value
End Set
End Property

Property Id() As Integer
Get
Return iId
End Get
Set(ByVal Value As Integer)
iId = Value
End Set
End Property


Sub Run(ByVal iTaskRunId As Int32, ByVal bTaskMode As Boolean)

Console.WriteLine("Task Id = " + Id.ToString + " Sequence = " +
Sequence.ToString)
Console.WriteLine("Task Run Id = " + iTaskRunId.ToString + " Task
Mode = " + bTaskMode.ToString)
Console.WriteLine()


Return
End Sub
End Class



My System SpecsSystem Spec
Reply

Thread Tools



Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46