Re: About Thread Completion Notify.
- From: "objectref" <objectref@xxxxxxxxxxxxx>
- Date: Wed, 15 Jun 2005 13:05:24 +0200
Nicholas,
thanks for the reply.
The reason i cannot do what you suggest me, is that i want to keep track
from the main
thread of all the threads that i spawn, so to be able to stop a thread that
it stalls.
This is a runtime system i have build and there is a possibility for a give
request to
stall, that is, come into an endless loop and the Tn will be live forever.
So, i have to keep track of them and i want to identify and stop a nasty
thread.
This is the reason that i must keep track of the threads and they have to
notify, somehow,
the T1 for their completion status.
Imagine that every thread that i spawn, belongs to an array and when
it finish it's job, i remove it from the array.
Threads that remain in the array for a specified time, are consinered
"nasty" and
will be stop and removed from there...
Any thoughts on this ?
thanks again!
"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote in
message news:eiHOzQPcFHA.2664@xxxxxxxxxxxxxxxxxxxxxxx
> objectref,
>
> Instead of using events and whatnot, why not just have the DoWork
> method call a function at the end to indicate that the task is done, and
> then perform whatever work you need to do at that point? Unless you have
> a thread somewhere else waiting on the fact that these tasks are done
> (which you probably don't since you are servicing requests in separate
> threads anyways), you shouldn't have a need for waiting on events.
>
> Hope this helps.
>
>
> --
> - Nicholas Paldino [.NET/C# MVP]
> - mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>
> "objectref" <objectref@xxxxxxxxxxxxx> wrote in message
> news:%23WQzMMOcFHA.1392@xxxxxxxxxxxxxxxxxxxxxxx
>> 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.Threading;
>>
>> 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.WriteLine("Main thread is waiting for BOTH tasks to complete.");
>> ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
>> ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
>> WaitHandle.WaitAll(waitHandles);
>>
>> // The time shown below should match the longest task.
>> Console.WriteLine("Both tasks are completed (time waited={0})",
>> (DateTime.Now - dt).TotalMilliseconds);
>>
>> // Queue up two tasks on two different threads;
>> // wait until any tasks are completed.
>> dt = DateTime.Now;
>> Console.WriteLine();
>> Console.WriteLine("The main thread is waiting for either task to
>> complete.");
>> ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
>> ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
>>
>> int index = WaitHandle.WaitAny(waitHandles);
>> // The time shown below should match the shortest task.
>> Console.WriteLine("Task {0} finished first (time waited={1}).",
>> index + 1, (DateTime.Now - dt).TotalMilliseconds);
>> }
>>
>> static void DoTask(Object state) {
>> AutoResetEvent are = (AutoResetEvent) state;
>> int time = 1000 * r.Next(2, 10);
>> Console.WriteLine("Performing a task for {0} milliseconds.", time);
>> Thread.Sleep(time);
>> are.Set();
>> }
>> }
>>
>>
>>
>> thanks in advance fro any help
>>
>
>
.
- References:
- About Thread Completion Notify.
- From: objectref
- Re: About Thread Completion Notify.
- From: Nicholas Paldino [.NET/C# MVP]
- About Thread Completion Notify.
- Prev by Date: Problem with HttpDownloader by Kent Boogaart
- Next by Date: SQL SERVER, DataRows and Null Dates
- Previous by thread: Re: About Thread Completion Notify.
- Next by thread: When is Application_End event called?
- Index(es):
Relevant Pages
|