There is a limit of 10,000 posted messages per message queue. This limit should be sufficiently large. If your application exceeds the limit, it should be redesigned to avoid consuming so many system resources. To adjust this limit, modify the following registry key.https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644944%28v=vs.85%29.aspx
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimitThe minimum acceptable value is 4000.
2. And this explains why Invoke hangs when reaches the limit:
private object MarshaledInvoke(Control caller, Delegate method, object[] args, bool synchronous) { int lpdwProcessId; /// .... /// skipped /// .... if (flag) this.InvokeMarshaledCallbacks(); else { UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), threadCallbackMessage, IntPtr.Zero, IntPtr.Zero); } if (!synchronous) return entry; if (!entry.IsCompleted) this.WaitForWaitHandle(entry.AsyncWaitHandle); // <<<< OOPS if (entry.exception != null) throw entry.exception; return entry.retVal; }
http://workblog.pilin.name/2007/04/control.html
It's a scary, scary world
No comments:
Post a Comment