vb.net - What's the proper use of WaitOne() function -


i experimented thread pool examples. i've started fibonacci example on msdn web site, this wasn't suitable more 64 calculations, i've resolved code:

imports system.threading  module module1     public class fibonacci         private _n integer         private _fibofn         private _doneevent manualresetevent          public readonly property n() integer                             return _n             end         end property          public readonly property fibofn() integer                             return _fibofn             end         end property          sub new(byval n integer, byval doneevent manualresetevent)             _n = n             _doneevent = doneevent         end sub          ' wrapper method use thread pool.         public sub threadpoolcallbackmar(byval threadcontext object)             dim threadindex integer = ctype(threadcontext, integer)             console.writeline("thread {0} started...", threadindex)             _fibofn = calculate(_n)             console.writeline("thread {0} result calculated...", threadindex)             _doneevent.set()         end sub          public function calculate(byval n integer) integer             if n <= 1                 return n             end if             return calculate(n - 1) + calculate(n - 2)         end function      end class       <mtathread()>     sub main()         const fibonaccicalculations integer = 65          ' 1 event used each fibonacci object         dim doneevents(fibonaccicalculations) manualresetevent         dim fibarray(fibonaccicalculations) fibonacci         dim r new random()          ' configure , start threads using threadpool.         console.writeline("launching {0} tasks...", fibonaccicalculations)          integer = 0 fibonaccicalculations             doneevents(i) = new manualresetevent(false)             dim f = new fibonacci(r.next(20, 40), doneevents(i))             fibarray(i) = f             threadpool.queueuserworkitem(addressof f.threadpoolcallbackmar, i)         next          console.writeline("all calculations complete.")          integer = 0 fibonaccicalculations             doneevents(i).waitone()             dim f fibonacci = fibarray(i)             console.writeline("fibonacci({0}) = {1}", f.n, f.fibofn)         next          console.read()     end sub end module 

the use of waitone() instead of waitall() resolve problem question is: if don't need display results don't need neither second loop, but... without second loop i've put waitone() function?

your code this:

// start bunch of threads calculations  console.writeline("all calculations complete."); // lie!  // wait threads exit 

the primary problem here calculations are not complete when make call console.writeline. well, might complete, don't know unless you've waited on event see it's signaled.

the purpose of waitone tell if calculation has completed. code should written this:

    integer = 0 fibonaccicalculations         doneevents(i) = new manualresetevent(false)         dim f = new fibonacci(r.next(20, 40), doneevents(i))         fibarray(i) = f         threadpool.queueuserworkitem(addressof f.threadpoolcallbackmar, i)     next      console.writeline("all calculations started. waiting them complete.")      integer = 0 fibonaccicalculations         doneevents(i).waitone()         dim f fibonacci = fibarray(i)         console.writeline("fibonacci({0}) = {1}", f.n, f.fibofn)     next      console.writeline("all calculations complete.") 

you must check event know calculation complete.

now, if don't need know if calculation complete, there's no need waitone @ all. , if you're not going wait on event, there's no real need have event, there? although 1 wonders why you're going calculation , not use result.


Comments

Popular posts from this blog

image - ClassNotFoundException when add a prebuilt apk into system.img in android -

I need to import mysql 5.1 to 5.5? -

Java, Hibernate, MySQL - store UTC date-time -