hi to all folks,
i want to create the following senario:
i have a T1 (Thread 1) that acts like http server that receives incoming
requests.
From that T1, i want to spawn from T1 to Tn thread jobs and beeing able to
be
notified when each of these threads finished it's job.
I would like to implement it with the functionality of the ThreadPool,
i also looked at WaitHandle, WaitAny etc etc.
I also noticed from the msdn example that if i use the AutoResetEvent. Set()
method, i just set the state of the event to signaled but i see no way of
quering this and find it's state so i can understand that it is completed
, and the WaitAll and WaitAny stuff just blocks my T1 so all or any Tn
finishes it's job.
But how i can automate this procedure and each thread notify the main T1 of
the completion of it's job ??
the following is from the msdn help:
using System;
using System.Threadin g;
public sealed class App {
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[] {
new AutoResetEvent( false),
new AutoResetEvent( false)
};
// Define a random number generator for testing.
static Random r = new Random();
static void Main() {
AutoResetEvent are = new AutoResetEvent( false);
are.Set
// Queue up two tasks on two different threads;
// wait until all tasks are completed.
DateTime dt = DateTime.Now;
Console.WriteLi ne("Main thread is waiting for BOTH tasks to complete.");
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[0]);
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[1]);
WaitHandle.Wait All(waitHandles );
// The time shown below should match the longest task.
Console.WriteLi ne("Both tasks are completed (time waited={0})",
(DateTime.Now - dt).TotalMillis econds);
// Queue up two tasks on two different threads;
// wait until any tasks are completed.
dt = DateTime.Now;
Console.WriteLi ne();
Console.WriteLi ne("The main thread is waiting for either task to
complete.");
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[0]);
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[1]);
int index = WaitHandle.Wait Any(waitHandles );
// The time shown below should match the shortest task.
Console.WriteLi ne("Task {0} finished first (time waited={1}).",
index + 1, (DateTime.Now - dt).TotalMillis econds);
}
static void DoTask(Object state) {
AutoResetEvent are = (AutoResetEvent ) state;
int time = 1000 * r.Next(2, 10);
Console.WriteLi ne("Performing a task for {0} milliseconds.", time);
Thread.Sleep(ti me);
are.Set();
}
}
thanks in advance fro any help
i want to create the following senario:
i have a T1 (Thread 1) that acts like http server that receives incoming
requests.
From that T1, i want to spawn from T1 to Tn thread jobs and beeing able to
be
notified when each of these threads finished it's job.
I would like to implement it with the functionality of the ThreadPool,
i also looked at WaitHandle, WaitAny etc etc.
I also noticed from the msdn example that if i use the AutoResetEvent. Set()
method, i just set the state of the event to signaled but i see no way of
quering this and find it's state so i can understand that it is completed
, and the WaitAll and WaitAny stuff just blocks my T1 so all or any Tn
finishes it's job.
But how i can automate this procedure and each thread notify the main T1 of
the completion of it's job ??
the following is from the msdn help:
using System;
using System.Threadin g;
public sealed class App {
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[] {
new AutoResetEvent( false),
new AutoResetEvent( false)
};
// Define a random number generator for testing.
static Random r = new Random();
static void Main() {
AutoResetEvent are = new AutoResetEvent( false);
are.Set
// Queue up two tasks on two different threads;
// wait until all tasks are completed.
DateTime dt = DateTime.Now;
Console.WriteLi ne("Main thread is waiting for BOTH tasks to complete.");
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[0]);
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[1]);
WaitHandle.Wait All(waitHandles );
// The time shown below should match the longest task.
Console.WriteLi ne("Both tasks are completed (time waited={0})",
(DateTime.Now - dt).TotalMillis econds);
// Queue up two tasks on two different threads;
// wait until any tasks are completed.
dt = DateTime.Now;
Console.WriteLi ne();
Console.WriteLi ne("The main thread is waiting for either task to
complete.");
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[0]);
ThreadPool.Queu eUserWorkItem(n ew WaitCallback(Do Task), waitHandles[1]);
int index = WaitHandle.Wait Any(waitHandles );
// The time shown below should match the shortest task.
Console.WriteLi ne("Task {0} finished first (time waited={1}).",
index + 1, (DateTime.Now - dt).TotalMillis econds);
}
static void DoTask(Object state) {
AutoResetEvent are = (AutoResetEvent ) state;
int time = 1000 * r.Next(2, 10);
Console.WriteLi ne("Performing a task for {0} milliseconds.", time);
Thread.Sleep(ti me);
are.Set();
}
}
thanks in advance fro any help
Comment