Dot-Net
此異常消息中引用了什麼“配額”:沒有足夠的配額可用於處理此命令
我有一個引發以下異常的 .NET 應用程序:
System.ComponentModel.Win32Exception : Not enough quota is available to process this command at MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd, Int32 msg, IntPtr wparam, IntPtr lparam) at MS.Win32.ManagedWndProcTracker.HookUpDefWindowProc(IntPtr hwnd) at MS.Win32.ManagedWndProcTracker.OnAppDomainProcessExit() at MS.Win32.ManagedWndProcTracker.ManagedWndProcTrackerShutDownListener.OnShutDown(Object target) at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e)我個人無法重現此異常,但我從使用者那裡得到了很多異常報告。
“配額”指的是什麼?堆棧跟踪使我相信這可能是 Windows 消息隊列的問題。
任何有關可能導致此錯誤或如何解決此錯誤的想法將不勝感激。
編輯,更多資訊: 這是在所有機器上的 32 位 Windows XP 上,異常不在我的程式碼中,而是在某種 .NET Framework 事件處理程序中。應用程序本身不進行任何 PostMessage 呼叫。
程序可以分配的特定類型的 Windows 資源量在技術上僅受程序可用的虛擬記憶體量的限制。這可能是一個相當大的數字,尤其是在 64 位版本的 Windows 上。其中一些資源從內部堆中提取,所有其他程序也從中提取。如果 Windows 讓一個程序將其全部消耗掉,這仍然是一個非常大的數字。
這當然沒有意義,永遠不應該允許程序吞噬所有可用資源。這就是配額的作用,它為某種類型的資源的計數數量設置了上限。常見的例子是 10,000 個視窗、10,000 個 GDI 對象、10,000 個句柄。並非所有這些都是像這樣的好整數。
需要更多地了解您的 PostMessage() 呼叫的作用,但合理的猜測是它正在推動消息隊列大小超過配額。同樣,在技術上僅限於可用虛擬記憶體大小的資源。但實際上應該保持在南部。如果準確,則您發布消息的速度超過了消息的消耗速度,因此需要進行節流。這發生在您的程序終止的確切時間表明可能需要另一種解釋。可能是執行緒關閉順序問題。