I can't help but notice awful threading designs manifested in some apps (which will remain nameless). Here are some random grievances I have with these apps:
1. Don't block the UI thread, especially not on file or network access. When you block the UI thread in a GUI app, the app effectively hangs.
For example, one app has a "favorites menu" which contains a list or URLs. It has an icon next to each URL, which is determined by the URL's content. Empirically, it looks like when I open the menu, it pings each of those URLs to get the content so that it can show the proper icon. I know nobody would actually do something that horrible, but that's what it looks like to the end-user. The net effect is that opening the menu causes the app to hang. The menu remains open as a top-level window even when you switch to a different app, which means it visually impairs the rest of your session.
Another app appears to have some "background autosave" feature which saves a backup copy of your current file next to the original. However, if you've opened the original over a network share, then this background save is now a background network access.
One challenge here is that it may be easy to call a function which calls another function, which eventually does the network access.
2. Don't make everything Modal. Although modal dialogs are simpler to use safely than modeless, there is a usability issue here. If a user needs to use two windows at once, don't make them each modal. Imagine if Visual Studio's Callstack window was modal. I think Visual Studio does a great job here of making the right things modeless, and providing a good docking infrastructure in the shell to manage the windows.
What else would you add to the list?