Производительность ListView.click против Button.Click - PullRequest
1 голос
/ 02 декабря 2011

У нас проблемы со скоростью в некоторых частях нашего приложения, стандартного приложения .NET 4 для форм Windows.У нас есть ListView, содержащий некоторые коммерческие товары, и пользователь может щелкнуть по ним, чтобы положить его в корзину.Проблема в том, что при 10-кратном нажатии на один элемент в корзину добавляется только 4-6 элементов.

Я получаю тот же результат, когда создаю простое тестовое приложение с одним ListView и одним элементом.и debug.print в обработчике кликов.Я пытался добавить кнопку в том же приложении, и это быстро ..

Результаты от dotTrace Performance: ListView.click:

100,00 %   OnRun  •  6 454 ms  •  Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun
  100,00 %   RunMessageLoop  •  6 454 ms  •  System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, ApplicationContext)
    100,00 %   RunMessageLoopInner  •  6 454 ms  •  System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, ApplicationContext)
      100,00 %   FPushMessageLoop  •  6 454 ms  •  System.Windows.Forms.Application+ComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
        17,87 %   [Native code]  •  1 153 ms
          17,87 %   Callback  •  1 153 ms  •  System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)
            17,87 %   WndProc  •  1 153 ms  •  System.Windows.Forms.Control+ControlNativeWindow.WndProc(Message&)
              17,87 %   OnMessage  •  1 153 ms  •  System.Windows.Forms.Control+ControlNativeWindow.OnMessage(Message&)
                17,87 %   WndProc  •  1 153 ms  •  System.Windows.Forms.ListView.WndProc(Message&)
                  ►17,54 %   WmMouseDown  •  1 132 ms  •  System.Windows.Forms.ListView.WmMouseDown(Message&, MouseButtons, Int32)
                  ►0,33 %   WndProc  •  21 ms  •  System.Windows.Forms.Control.WndProc(Message&)

Button.click:

100,00 %   OnRun  •  5 931 ms  •  Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun
  100,00 %   RunMessageLoop  •  5 931 ms  •  System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, ApplicationContext)
    100,00 %   RunMessageLoopInner  •  5 931 ms  •  System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, ApplicationContext)
      100,00 %   FPushMessageLoop  •  5 931 ms  •  System.Windows.Forms.Application+ComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
        0,44 %   [Native code]  •  26 ms
          0,44 %   Callback  •  26 ms  •  System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)
            0,44 %   WndProc  •  26 ms  •  System.Windows.Forms.Control+ControlNativeWindow.WndProc(Message&)
              0,44 %   OnMessage  •  26 ms  •  System.Windows.Forms.Control+ControlNativeWindow.OnMessage(Message&)
                0,44 %   WndProc  •  26 ms  •  System.Windows.Forms.Button.WndProc(Message&)
                  0,44 %   WndProc  •  26 ms  •  System.Windows.Forms.ButtonBase.WndProc(Message&)
                    0,44 %   WndProc  •  26 ms  •  System.Windows.Forms.Control.WndProc(Message&)
                      ►0,25 %   WmMouseDown  •  15 ms  •  System.Windows.Forms.Control.WmMouseDown(Message&, MouseButtons, Int32)
                      ►0,10 %   WmMouseUp  •  6 ms  •  System.Windows.Forms.Control.WmMouseUp(Message&, MouseButtons, Int32)
                      ►0,08 %   WmPaint  •  5 ms  •  System.Windows.Forms.Control.WmPaint(Message&)

Любые предложения о том, что делать?

Ответы [ 2 ]

1 голос
/ 12 января 2012

Как предложил Ханс Пассант, мне нужно обрабатывать ListView.Click и ListView.DoubleClick.

0 голосов
/ 02 декабря 2011

Попробуйте Mouse_ClickEvent

 private void ListView_MouseClick(object sender, MouseEventArgs e)
    {
        ListViewHitTestInfo li = lvTracks.HitTest(new Point(e.X, e.Y));
        if (li != null)
        {
            if (li.Item != null)
            {
             ListViewItem l=li.Item;
                //do something with l
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...