Catching Thread Exceptions in C#

I have a Winforms app where I am performing asynchronous functions. I am using the delegate model and have threadsafe calls for updating my UI. My worker threads happen in an instance of another class, not the class that is the form.

I had the impression that the global Application.ThreadException event handler would catch exceptions that happened off on my working threads. This does not seem to be the case. The following code (as a console app) shows my problem and won't catch the exception. The program executes as if nothing bad happened.

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.Remoting.Messaging;
using System.Threading;
 
namespace BadThreadException
{
    class Program
    {
        delegate void WorkerDelegate(int input);
 
        static void Main(string[] args)
        {
            Application.ThreadException += new ThreadExceptionEventHandler(App_ThreadException);
 
            Worker mult = new Worker();
 
            AsyncCallback callback = new AsyncCallback(Finished);
 
            WorkerDelegate threadedWork = new WorkerDelegate(mult.DoSomethingImpressive);
 
            threadedWork.BeginInvoke(9, callback, null);
 
            Console.ReadKey();
        }
 
        static void Finished(IAsyncResult result)
        {
            Console.WriteLine("Done");
        }
 
        static void App_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            Console.WriteLine("Got an error");
        }
    }
 
    class Worker
    {
        public void DoSomethingImpressive(int input)
        {
            throw new Exception("Ouch");
        }
    }
 
}

Well, I definitely need a solution to the problem, since exceptions definitely can happen off in my worker class. After some research, it turns out that you must call the EndInvode method on the delegate for the exception to bubble up. In my case, I wasn't calling it because there was no return type. Now I understand why people frequently mention it is a best practice to always call EndInvoke, even if you don't care about the return value (Doh!). The correct callback looks like this:

        static void Finished(IAsyncResult result)
        {
            AsyncResult ar = (AsyncResult)result;
            WorkerDelegate d = (WorkerDelegate)ar.AsyncDelegate;
 
            try
            {
                d.EndInvoke(ar);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Got an error on the callback");
            }
 
            Console.WriteLine("Done");
        }

I still haven't discovered how/when the Application.ThreadException event handler gets called.

Posted: Sunday, November 30, 2008 4:33:50 AM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
Winforms

Quick ADO.Net Tip

If you need to stop a datareader in the middle, instead of at the end, you have to call cancel on the command object. Calling the Close() method will result in a timeout exception.

using (SqlCommand cmd = new SqlCommand(sql, conn))
{
          XmlReader reader = cmd.ExecuteXmlReader();
          reader.Read();

while (!reader.EOF)
{
            if (this.Cancel)
            {
                cmd.Cancel();
                reader.Close():
                break;
            }
            holder = reader.ReadOuterXml();
}
}
Posted: Monday, November 10, 2008 4:47:04 PM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
.Net 2.0

Getting Started with WCF and REST

Now that WCF has support for REST in .Net 3.5, it's time to get learning....

WCF REST Starter Kit

A Guide to Designing and Building RESTful Web Services with WCF 3.5

A bunch of screencasts by Aaron Skonnard

WCF and REST from the PDC

Dan Rigsby - REST support in WCF

Posted: Tuesday, November 04, 2008 12:58:09 AM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
.Net 3.5 | WCF

Out of the blue....

I posted my Day of .Net presentation (PowerPoint slides) on SlideShare. Apparently they have an editorial board that picks presentations to highlight on their home page, and they picked mine! I had no idea they even did this. I tried a new presentation format (thanks to Josh Holmes), and apparently it's working out well.

[Originally posted at http://www.dotnetjunkies.com/WebLog/davetrux/archive/2008/10/23.aspx]

Posted: Thursday, October 23, 2008 3:56:07 PM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
Speaking

Day of .Net Presentation Resources

Thanks to everyone who attended my talk! Here's some links related to the talk:

My PowerPoint Presentation hosted on SlideShare

Debugging Tools for Windows web site / download WinDBG

IIS Resource Kit (TinyGet)

LogParser for querying IIS log files

FireBug

YSlow

John Robbins' book on .Net 2.0 Debugging

 

Good blog posts on WinDBG

A Big List of Debugging Resources

Getting Started with WinDBG Part I

Getting Started with WinDBG Part II

Debugging Demos

 

[Originally posted at http://www.dotnetjunkies.com/WebLog/davetrux/archive/2008/10/21/536761.aspx]

Posted: Tuesday, October 21, 2008 3:01:32 PM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
Speaking

Speaking at Day of .Net in Ann Arbor, MI

I am giving a talk at the next Day of .Net in Ann Arbor. I am giving a talk entitled "Beyond Breakpoints: Debugging and Troubleshooting". Basically I will be talking about finding bugs and performance problems, looking at techniques that go further than setting a breakpoint and stepping through some code.

Sessions have been posted and registration is open!

 

[Originally posted at http://www.dotnetjunkies.com/WebLog/davetrux/archive/2008/9/29.aspx]

Posted: Monday, September 29, 2008 2:00:31 PM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
Speaking

Day of .Net in Ann Arbor

Day of .Net in Ann Arbor this fall is on October 18th:

Day of .Net October 18, 2008 - Be there!
Posted: Monday, September 08, 2008 3:55:49 AM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback

Snipping Tool - A Vista Enhancement for Developers

Saw a great post about the Snipping tool in Vista: The Blog at the End of the Universe : Why Vista? (Volume 4 -- Snipping Tool). For an old-time Alt+Print Screen guy, this thing is great. But the first time I looked for it, it wasn't there (I'm using Vista Business). I guess by default it isn't always installed, but it is available, there is an article describing how to activate the Snipping Tool at PCWorld.

Posted: Friday, August 08, 2008 1:05:09 AM (Eastern Standard Time, UTC-05:00)  #    Comments - Trackback
Tools