Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my code stopping and not returning an exception?

I have some code that starts a couple of threads to let them execute, then uses a while loop to check for the current time passing a set timeout period, or for the correct number of results to have been processed (by checking an int on the class object) (with a Thread.Sleep() to wait between loops)

Once the while loop is set to exit, it calls Abort() on the threads and should return data to the function that calls the method.

When debugging and stepping through the code, I find there can be exceptions in the code running on the separate threads, and in some cases I handle these appropriately, and at other times I don't want to do anything specific.

What I have been seeing is that my code goes into the while loop and the thread sleeps, then nothing is returned from my function, either data or an exception. Code execution just stops completely.

Any ideas what could be happening?


Code sample:

System.Threading.Thread sendThread = 
     new System.Threading.Thread(new System.Threading.ThreadStart(Send));
sendThread.Start();

System.Threading.Thread receiveThread = 
     new System.Threading.Thread(new System.Threading.ThreadStart(Receive));
receiveThread.Start();

// timeout
Int32 maxSecondsToProcess = this.searchTotalCount * timeout;
DateTime timeoutTime = DateTime.Now.AddSeconds(maxSecondsToProcess);
Log("Submit() Timeout time: " + timeoutTime.ToString("yyyyMMdd HHmmss"));

// while we're still waiting to receive results & haven't hit the timeout, 
// keep the threads going
while (resultInfos.Count < this.searchTotalCount && DateTime.Now < timeoutTime)
{
    Log("Submit() Waiting...");
    System.Threading.Thread.Sleep(10 * 1000); // 1 minute
}

Log("Submit() Aborting threads");    // <== this log doesn't show up

sendThread.Abort();
receiveThread.Abort();

return new List<ResultInfo>(this.resultInfos.Values);
like image 597
BeckyLou Avatar asked May 11 '10 14:05

BeckyLou


People also ask

Does code stop after exception?

All methods in the call stack between the method throwing the exception and the method catching it have their execution stopped at the point in the code where the exception is thrown or propagated.

How do you return after throwing an exception?

After throwing an exception, you do not need to return because throw returns for you. Throwing will bubble up the call stack to the next exception handler so returning is not required.

Does throwing an exception return the function?

No, because throwing an exception is not a return. If the exception is not handled inside the function it will cause an immediate exit out of the function, passing control to the first point in the program where the exception will be catched ie handled.

What happens after catching exception C#?

The Anatomy of C# Exceptions catch – When an exception occurs, the Catch block of code is executed. This is where you are able to handle the exception, log it, or ignore it. finally – The finally block allows you to execute certain code if an exception is thrown or not.


1 Answers

So, you really shouldn't use the Sleep method on the thread for synchronization purposes. This is what synchronization classes such as ManualResetEvent are for, as well as the Asynchronous Programming Model (IAsyncResult implementations).

A better approach here would be to create a delegate with the signature of the method you want to run asynchronously. Then, assign the method group that is the entry point for the asynchronous operation to an instance of that delegate and call BeginInvoke on the delegate instance.

From there, you would run your loop, expect you would call the overload of WaitOne on the WaitHandle returned by the AsyncWaitHandle property of the IAsyncResult implementation returned by the call to BeginInvoke on the delegate.

This will cause less reliance on the Sleep method (which is bad for synchronization in general).

If you have the option to use .NET 4.0, then you might want to take a look at the Task class in the System.Threading.Tasks namespace as it provides an even better way to handle asynchronous processing, cancellation, and wait timeouts.

like image 68
casperOne Avatar answered Sep 19 '22 00:09

casperOne