createWindowEx
失敗した例外はoverbyteICS
、.net C# windowsforms で dll を使用しているサーバーによってスローされます。
1 日を通して多数のクライアントを処理するサーバーがあります。しかし、合計接続数 (つまり、接続と切断を合わせたもの) が 10000 に達すると、上記のエラーが表示され、サーバーはユーザー接続の受け入れを停止し、マシンもハングします。
よく診断してくださいました。はい、CreateWindowEx() の失敗と 10,000 は一緒です。10,000 は、プロセスのデフォルトの user32 オブジェクト クォータです。つまり、1 つのプロセスで 10,000 を超えるウィンドウを作成することは許可されていません。これは、非常によくあるバグであるウィンドウ ハンドルをリークするアプリに対する対策です。セッションで作成できるウィンドウの総数は限られたリソースであり、1 つのプロセスがそれらすべてを消費すると、完全な障害が発生し、Windows をシャットダウンできなくなります。
明らかに、あなたの場合は漏れではありません。レジストリ設定 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota を変更することで、一時的な問題を解決できます。再起動して有効にします。
多くのウィンドウを必要とするプロセスをマシンが実行していなければ、10,000 から最大 18,000 に増やしても問題ありません。Taskmgr.exe の [プロセス] タブで確認できるもの。[表示] + [列の選択] を選択し、[ユーザー オブジェクト] にチェックを入れます。また、GDI オブジェクトとハンドル、クォータを持つその他のリソースにもチェックマークを付けます。
長期的には、この動作はうまくスケーリングしません。すべての Web 要求に対してウィンドウ ハンドルを作成するコードを見つけて修正する必要があります。
Roger さんに同意しますが、最初に確認しましょう - このエラーが発生した場合SPY++
は、スタート メニューの MicrosoftVisualStudio\Tools から実行し、ウィンドウ ツリーを参照してください。ブランチを展開し、いくつかのウィンドウの重複を探します。確かにそれらの多くがあるでしょうが、あなたは何百、何千ものコピーに興味があります. それを打った場合、それはロジャーが言ったことです... ...そして、ハングしないことを確認するために、接続サーバープロセス(またはマシン全体)を定期的に再起動する以外にほとんど解決策はありません(もちろん、サーバーの再起動は、ユーザーをほとんど苛立たせます..)、または接続サーバープロセスを修正/パッチ適用/再実装して、よりリソースを使いやすくします..
単一の接続ごとに非表示のウィンドウを開くのは非常に無駄な方法ですが、それでもマシンがハングしないようにする必要があることに注意してください。処理できない接続を単にドロップする必要があります。ここでは、制限がまったく実装されていないように見えますが、これはバグです。
編集: NT 以前 (つまり、win9x) では、制限はハードコードされています。NT クラスのシステムでは、プールの微調整を試すことができます。
それでも、接続数が再び増加すると問題が再発するため、それを最後の復元と見なします。まず、サーバー開発者にpingを送信して、それを完全に修正してください..