I have a problem with with Thread.Join( Timeout ) where the timeout never occurs.
I basically need to make a connection to an AS400 box which works fine. Once in a blue moon the AS400 gets a problem and the way this is handled on AS400 is by hanging. If I was to connect directly this would mean my main process would hang as well, so I've spawned a worker thread and used a Thread.Join( Timeout ) to make sure it always returns with someting after a while.
The problem is that if the worker thread with the AS400 call hangs, the Timeout never occurs.
Expand|Select|Wrap|Line Numbers
- private bool RunProgramThread() {
- // Create a new worker object to carry out the AS400 call, required for timeouts
- AS400WorkerClass workerObject = new AS400WorkerClass();
- workerObject.program = program;
- workerObject.parameters = parameters;
- // Create and start a new worker thread
- Thread workerThread = new Thread( new ThreadStart( workerObject.RunAS400Program ) );
- workerThread.IsBackground = true;
- workerThread.Start();
- return workerThread.Join( 10000 );
- }
This however always hangs the AS400 call, even with the AS400 calls that returns correctly with Thread.Join.
Expand|Select|Wrap|Line Numbers
- private bool RunProgramThread() {
- // Create a new worker object to carry out the AS400 call, required for timeouts
- AS400WorkerClass workerObject = new AS400WorkerClass();
- workerObject.program = program;
- workerObject.parameters = parameters;
- // Create and start a new worker thread
- Thread workerThread = new Thread( new ThreadStart( workerObject.RunAS400Program ) );
- workerThread.IsBackground = true;
- workerThread.Start();
- while ( !workerThread.IsAlive ) { }; // Let the thread start up before we check on it
- // Check every 100ms to see if thread has finished. If timeout, drop it and move on
- int timeOutDelay = 10000;
- DateTime runUntil = DateTime.Now.Add( new TimeSpan( 0, 0, 0, 0, timeOutDelay ) );
- while ( ( DateTime.Now < runUntil ) && workerThread.IsAlive ) {
- System.Threading.Thread.Sleep( 100 );
- }
- if ( workerThread.IsAlive ) { // If worker thread is still alive it failed to finish in time
- // Send an abort if the thread execution has timed out
- workerThread.Abort();
- return false;
- }
- else {
- // Worker thread has finished correctly
- return true;
- }
- }
Some will now say the AS400 call class isn't working, but it is if I use Thread.Join. Hmmmm...?
Any help very welcome before I lose all my hair, which by now is all grey anyway.
Thanks,
Chrace