7


3

Winforms ClickイベントがMouseClickイベントより遅いのはなぜですか?

ループ付きのフォームにボタンを追加していますが、クリックイベントハンドラーを追加するとアプリケーションの速度が低下しすぎることに気付きました。 その後、クリックイベントの代わりにマウスクリックイベントを試しましたが、すぐに動作します。

テスト結果を示すこのスクリーンショット:image:https://i.stack.imgur.com/Mb6pp.png [alt text]ソースコード:http://pastebin.com/qVewNm1u

1000イベントハンドラーの結果:+クリック:2892msマウスクリック:1ms

Clickイベントが非常に遅い理由がわかりません。

編集:ビルドプラットフォームターゲットをx64または任意のCPUに変更すると、結果が変わります:クリック:5、マウスクリック:9

Edit2:スクリーンショットを変更し、より良い結果が表示されるようになりました。

Edit3:https://connect.microsoft.com/VisualStudio/feedback/details/597039/winforms-click-event-slower-than-the-mouseclick-event

4 Answer


5


私は再現しますが、VS2010に固有です。 VS2008にはこのような動作はなく、両方とも1ティック未満で実行されます。 また、に依存しません .NET version.

これは、Ultimateエディションで利用可能なIntelliTraceの欠陥のようです。 より深く掘り下げ、アンマネージコードのデバッグを有効にしようとすると、効果がなくなりました。 [プロジェクト+プロパティ]、[デバッグ]タブで、[アンマネージコードのデバッグを有効にする]にチェックマークを付けます。 また、デバッガー(Ctrl + F5)を使用せずにプログラムを実行すると、効果が削除されました。 スラムダンクは、[ツール] + [オプション]、[IntelliTrace]、[一般]の順にクリックし、[有効]を選択解除して効果を削除します。

調査結果をconnect.microsoft.comに投稿することをお勧めします。 フィードバックレポートでこのスレッドを参照できます。 問題を診断するために知っておく必要があるすべてのものが利用可能です。

前述のように、回避策はIntelliTraceを無効にすることです。 これは、顧客のマシンで問題にならないことが保証されています。


0


イベントハンドラーの添付ファイルを測定する前に、最初にボタンを作成しようとしましたか?

ここには少なくとも2つの不明点があります。1)ボタンコンストラクターの実行時間、2)イベントハンドラーのサブスクリプション。

*更新:*問題を再現しようとしましたが、両方のテストで一貫して4ms-6msを取得します。 1つのテストは常に遅いのですか、それとも1回だけですか? ジッティングとGCで、常に100%確定的とは限らない奇妙なことが起こることがあります。


0


何が起こっているのかはわかりませんが、テストスイートにはいくつかの問題があります。

最初に、おそらくConsole.WriteLineを実行する前にタイマーを停止する必要があります。これは、WriteLineで使用される文字列の作成にかかる時間も測定しているためです。

第二に、スタック、ヒープ、ガベージコレクション、およびその他の潜在的な問題を含むボタン作成時間も測定しているため、タイマーを開始する前にボタンを作成することができます。 ボタンを配列に割り当て、ストップウォッチを開始した後、アイテムに偶数ハンドラーを割り当てることをお勧めします。


0


ClickTest()にはわずか4msしかないため、わかりません。 ただし、コードをこれに変更し、4msの時間がなくなりました。

EventHandler d = new EventHandler(Form1_Click);
for (int i = 0; i < buttons.Length; i++) buttons[i].Click += d;

書いたループ内のコードは、 `button [i] .Click + = new EventHander(Form_Click)`と同等です。これは、反復ごとに新しいデリゲートインスタンスを作成します。