I just had to respond to this post linked to from the ClientJava blog. As Cedric pointed out in the comments, its very common to have to deal with marshaling updates onto another thread when performing operations in the background.

In .NET 1.0/1.1 the controls in Windows Forms are a little more forgiving but updating the UI from any thread other than the message pump is a recipe for disaster (especially for the DataGrid control). In .NET 2.0 the code has been tightened to throw an exception as soon as someone tries to update the UI from the wrong thread – this is a defensive technique to ensure that bugs don’t leak out into production code.

As Cedric pointed out – even AWT and Swing have an invokeLater() method (in .NET, its Invoke()).