It's always the Invoke
If you are working on the .NET Compact Framework 1.0 and you get an ArgumentException trying to manipulate your UI (such as adding a Control to a form), you are likely doing this operation from a thread other than you UI thread and should be using
Invoke. Thanks to jonfroelich's post "Controls.Add ArgumentException" for putting me on the right path. With all my frustrating debugging and unexplained freezes, i'd completely forgot that the particular code branch I was looking at was initiated by a callback from a WorkerThread.
Of course the Invoke facilities of .NETCF 1.0 are pitiful, lacking the things that make this whole single-threaded UI business bearable in regular Windows.Forms. There is not
InvokeRequired for one thing, nor is there
BeginInvoke. And even
Invoke just provides the
Invoke(Delegate) signature, not the much more useful
Add to that that the only valid
Delegate is an EventHandler, which takes two arguments, the exclusion of
Invoke(Delegate, Object) really is painful.