473,387 Members | 1,705 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Thread.Join( Timeout ) hanging when executing 3rd party software

6
Hi all,

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
  1. private bool RunProgramThread() {
  2.     // Create a new worker object to carry out the AS400 call, required for timeouts
  3.     AS400WorkerClass workerObject = new AS400WorkerClass();
  4.     workerObject.program = program;
  5.     workerObject.parameters = parameters;
  6.  
  7.     // Create and start a new worker thread
  8.     Thread workerThread = new Thread( new ThreadStart( workerObject.RunAS400Program ) );
  9.     workerThread.IsBackground = true;
  10.     workerThread.Start();
  11.  
  12.     return workerThread.Join( 10000 );
  13. }
So I went the other way and made my own monitor. Spawn a thread and do a while loop on the main thread and check Thread.IsAlive (ie whether the worker thread has finished) every 100ms until Timeout.

This however always hangs the AS400 call, even with the AS400 calls that returns correctly with Thread.Join.

Expand|Select|Wrap|Line Numbers
  1. private bool RunProgramThread() {
  2.     // Create a new worker object to carry out the AS400 call, required for timeouts
  3.     AS400WorkerClass workerObject = new AS400WorkerClass();
  4.     workerObject.program = program;
  5.     workerObject.parameters = parameters;
  6.  
  7.     // Create and start a new worker thread
  8.     Thread workerThread = new Thread( new ThreadStart( workerObject.RunAS400Program ) );
  9.     workerThread.IsBackground = true;
  10.     workerThread.Start();
  11.  
  12.     while ( !workerThread.IsAlive ) { }; // Let the thread start up before we check on it
  13.  
  14.     // Check every 100ms to see if thread has finished. If timeout, drop it and move on
  15.     int timeOutDelay = 10000;
  16.     DateTime runUntil = DateTime.Now.Add( new TimeSpan( 0, 0, 0, 0, timeOutDelay ) );
  17.     while ( ( DateTime.Now < runUntil  ) && workerThread.IsAlive ) {
  18.         System.Threading.Thread.Sleep( 100 );
  19.     }
  20.     if ( workerThread.IsAlive ) { // If worker thread is still alive it failed to finish in time
  21.         // Send an abort if the thread execution has timed out
  22.         workerThread.Abort();
  23.         return false;
  24.     }
  25.     else {
  26.         // Worker thread has finished correctly
  27.         return true;
  28.     }
  29. }
My own monitor always returns though, but always returns a false as the AS400 calls fails. If I substitute the AS400 calls with a simple System.Threading.Thread.Sleep(1000) in the WorkerClass it all works fine and dandy.

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
Feb 15 '08 #1
1 3271
Chrace
6
Does System.Threading.Thread.Sleep( x ) sleep any subthreads created by the main thread?

I have hooked this up to a Windows form system test harness and it seems that as soon as my self-developed timeout system exits the worker thread exits as well, so something is getting released. Or rather, something is getting blocked while I am doing my checking.

If the worker thread is blocked because of the sleep on the main thread it would make sense as the exit of the worker thread would then happen slightly after the main finishes execution.

Still doesn't explain that it can exit if I just use Sleep on the worker thread instead of the AS400 call.

Hmm, guess I answered my own question there.
Feb 15 '08 #2

Sign in to post your reply or Sign up for a free account.

Similar topics

0
by: Max Samookha | last post by:
Hi! Does anybody know how to abort a long-running asynchronous call from the calling thread? To do this, one needs a reference to the thread executing the call and there seems to be no easy way to...
6
by: ll | last post by:
Hi, How to specify the timeout value(ms) for a thread? Thanks.
4
by: JeffSinNHUSA via DotNetMonster.com | last post by:
Hi, I have a long running task that I want to run on a regular basis to do some db updates. I can't write a windows service because it is being hosted elsewhere. I want to run this task within...
4
by: oshinonline | last post by:
Hi, In my application I have RWTPtrSlist<POSIXThread>, where POSIXThread is my wrapper class. Whenever I create a new thread I call append on the list. But it hangs after I created 11/12...
1
by: Jon | last post by:
My question is: Can the Garbage Collector (GC) suspended a managed thread while it is executing native code. The reason I am interested in this is that I have: 1) a native thread (N) that only...
1
by: Andrue Cope | last post by:
Hi, We have a strange problem. We are invoking the FolderBrowseDialog and have found that if we cancel that dialog within a few seconds of it appearing it causes one of our (completely...
2
by: abid gee | last post by:
Please give a kind look on my question. and please comments. I am Using C# as development tool of Dot Net 2.0. I wrote a function read_data() that read data from Serial Port continuously.Till...
5
by: care02 | last post by:
Hi! I have the following problem: I have written a short Python server that creates an indefinite simulation thread that I want to kill when quitting (Ctrl-C) from Python. Googling around has...
3
by: Kevin | last post by:
Hi! Is there anyway to set a timeout for a Thread? Regards!
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.