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 Invoke(Delegate, Object[])
.
Add to that that the only valid Delegate
is an EventHandler, which takes two arguments, the exclusion of Invoke(Delegate, Object[])
really is painful.