I was working on XBList the other day when I hit a peculiarity of Visual Studio. I wanted to call a method asynchronously, so I was using BeginInvoke with a callback, as described in this article on MSDN. So I used BeginInvoke to fire off a method, and the method I invoked happened to throw an exception. I didn't expect this to be a big deal - when the callback was called, I would call EndInvoke which would re-throw the exception and I could deal with it. However, while running in Visual Studio's debugger, I got a break and an error dialog that claimed I had an unhandled exception. My code never made it to EndInvoke. It said something like “Exception unhandled by user code”.
It turns out that this is just some weirdness in Visual Studio. If you go to the Debug menu, choose “Exceptions…”, and uncheck “User-unhandled” for Common Language Runtime Exceptions, the exception will get properly thrown when EndInvoke is called, and everything's fine.
It's annoying that I have to give up...
I haven't been updating this blog too much recently. I never meant for this blog to run on a schedule, but I did intend to post more frequently than this. My original idea was that the blog would serve two major purposes. First, it is a place for me to announce new projects or updates to software and websites I've already released. It's done that quite well, though I haven't had much to announce recently. My job has been taking the majority of my development time, and most of the projects I've been working on at home are either private or haven't been released in the form I'd like to because my employer hasn't approved them for release yet.
The second major purpose for my blog is as a place for me to record the solution to problems I run across while developing software, so that others won't have to spend hours Googling or using trial and error to come to the same conclusion. I didn't intend to rehash things that were easily found or that had already been discussed - only to post when I felt it was something that added value to the internet that hadn't been there before. So a lot of the blog posts are not really a narrative or running commentary - they're not meant to be subscribed to, but found individually. It's for this reason that my most popular posts tend to include the exact text of error messages. This type of post has suffered both because I haven't been doing as much development, because I can't discuss a lot of what I've learned due to the nature of the projects I'm working on, and because I've been learning new stuff (like Ruby on Rails) and haven't done enough to have solved problems others haven't already posted solutions for.
The third reason I have this blog is to occasionally talk about my thoughts on different technical topics, from web development to video games. Again, I don't like to make a post unless I think I'm adding something new, and most of the topics I've wanted to talk about have already been covered. I had a lot of draft posts sitting around about web development, web standards, and the evolution of browsers, but then I discovered Alex Russell's blog and it turns out he's already said most of what I wanted to say, and better than I could. Other stuff, like my impressions of Windows Vista, critique of stackoverflow.com and suggestions for the Xbox Live Arcade lineup, have been covered to my satisfaction in plenty of places. Maybe some of them will end up posted, but probably not.
Another part of the reason I haven't posted much is the sheer weight of unfinished posts I have. Right now I have 64 drafts and only 52 real posts! So I'm going to attempt to clear things out by writing a little about what I haven't posted. A lot of this stuff wasn't posted because it fell under that third point above, but some of it I was just too lazy to flesh out into real posts. Some of it's just random stuff. So here's what's been happening in the last year:
A couple years back I posted the source of XBList's tray notification control on my site as the PopupNotify control. I licensed it under the LGPL so people could use it for their own applications. While I requested that whoever used it should let me...
While I was updating my PopupNotify control today, I realized that I had created another useful little control for XBList that I hadn't released, the WebLinkLabel Control. This simple control wraps the standard LinkLabel control to make it easier to...
I was working on XBList the other night when I realized something - the font used in its dialogs and the friends list wasn't Segoe UI. Segoe UI is the very pretty, ClearType-optimized new default dialog font in Windows Vista. In Windows XP and 2000...
That's a heck of a title, but it's a problem I hit recently. I have a bunch of ASP.NET sites that use MySQL as their datastore, but I hadn't tried the on IIS7 yet. It took a while to get them to work at all (I had to set permissions on web.config and...
This weekend I decided to go through the hodgepodge of common code that's shared between a lot of my ASP.NET websites and refactor it a bit. I'd only just learned about the magic of HttpModules and HttpHandlers, and I immediately saw a lot of canidates in my copy-paste code and global.asax handlers where a HttpModule would be a better solution. One of these was the code I was using to redirect old pages to new pages whenever I moved them. For example, at some point I had moved http://www.numbera.com/rome/tools.aspx to http://www.numbera.com/rome/tools/, and I wanted anyone who visited the old URL to get redirected to the new one. Previously, I just had some code in global.asax that hooked Application_OnError, checked to see if it was an HttpException (a 404 file not found, specifically), and then redirected if it knew where the file really was. Pretty simple, but not very general. So I broke it out into an HttpModule that basically did the same thing, but no longer required me to cut and paste code into my global.asax. However, one improvement I wanted to make was to allow for configuration through my web.config file, instead of having to hardcode an if/else tree for each redirect. I basically wanted to have a section in my web.config like this:
<redirect filePattern="tools.aspx" url="~/tools/" />
<redirect filePattern="strategy.aspx" url="~/strategy/" />
<redirect filePattern="military_people.aspx" url="~/people/" />
<redirect filePattern="history.aspx" url="~/history/" />
<redirect filePattern="teacher.aspx" url="~/teacher/" />