I couldn't find where to post the comment for the cross threading problem. While the solution seems to be Control.BeginInvoke/Control.Invoke, There seems is a known issue about Control.Invoke that can cause it to hang up in Control.MarshaledInvoke even after the delegate callback has returned. What's the workaround for that? Is it fixed in 2.0?
Ben, a fellow dev on my team, has made two GREAT posts on this subject which should help. The first is the crux behind why some folks see hangs using Control.Invoke on multi-proc machines. The second is how to workaround this problem until you get the next service pack of the framework or upgrade to 2.0.