GUI Programming: Always perform network requests asynchronously

Why does one feel ones so much more in control, when using Firefox, than Internet Explorer?

When you select a slow link in Internet Explorer, the whole program hangs for about 1-2 seconds. Firefox doesn't. Although 1-2 seconds is hardly a large % of ones life, it makes a big difference to the experience one has when using Firefox.

Recently I wrote something similar to an IM client (written in Java). It sits on the Windows tray. You can log in, and open a window where you can do various things. The data stored on a website (communication over XML-RPC).

MSN Messenger has one tray-icon for the user being logged out, a different one for the user being logged in, and amazingly (I thought), a third one for during the time the program spends communicating with the servers to log the user on.

In my system, log on is just one single XML-RPC call, with all the necessary data returned in the response. This was a design goal, to never have more than one client-server request to represent a particular user action.

The back-end to this XML-RPC call is a simple perl script which uses a few objects to represent things such as Users. These objects are simple enough, they just make a few SELECTs against our super-fast database. So I thought, as any request to our back-end takes say max 0.2 seconds, I needn't make that asynchronous to the UI of the Java program. And I certainly don't need a separate icon to display during that time!

If I'd ever stated that decision out loud, I would have heard myself saying it, and realized what a nonsense that is.

So now, every time I log on using that program, the dialog to log in opens, one clicks connect, and ... wait ... until the success or failure response is shown. And in that time, the program is just dead. It doesn't even redraw its windows. It may only be 0.5 seconds, but you notice it.

Lesson – it may sound obvious – but it's still worth stating: In a GUI Program (Windows, Mac OS X, etc.), any user interaction over a network, must be performed asynchronously (i.e. in a thread or in a separate process).

This article is © Adrian Smith.
It was originally published on 23 Apr 2007
More on: Software Architecture