Долгое открытие формы на Windows Server 2016

205
14 января 2019, 03:30
var form = new MyForm(someargs);
//400 мс
form.ShowDialog();
...
private void myForm_Load(object sender, EventArgs e)
{
   //4500 мс после form.ShowDialog() на Windows 2016
}

Между вызовом form.ShowDialog() и срабатыванием обработчика события Load myForm_Load проходит:

  1. на Windows Server 2008R2 ~250мс
  2. на Windows Server 2016 ~4500мс

Железо:

  1. на Windows Server 2008R2 2.8x12 ГГц физический сервер
  2. на Windows Server 2016 2.4x20 ГГц виртуальная машина на Hyper-V

Структура формы. TableLayoutPanel c Dock==DockStyle.Fill. На ней пару десятков TextBox, ComboBox, Label и т.п. Ещё две Button, и по одному TabControl и DataGridView. И пара экземпляров наследника UserControl.

Свойство DoubleBuffered формы равно true, пробовал false скорость не изменилась

Что там так долго происходит? Что можно проверить?

Обновление

Код обработчиков событий формы и пользовательских элементов управления, был отпрофилирован самописным профилировщиком на основе StopWatch. Удалось установить, что задержка возникает в два этапа. Каждый раз она возникает перед вызовом сеттера пользовательского свойства SelectedValue элемента управления. Кстати это свойство помечено, как bindable для класса с помощью [System.ComponentModel.DefaultBindingProperty("SelectedValue")]. Но что именно тратит время так и не известно.

Обновление 2

Найден виновник тормозов. Это ComboBox с очень большим количеством элементов в DataSource. Теперь у меня есть МСВП:

    ...
    private void button1_Click(object sender, EventArgs e)
    {
        var form = new MyForm(); //  76мс 2008R2;  123мс 2016
        form.ShowDialog();       //1820мс 2008R2;12440мс 2016
    }
}
public class MyForm : Form
{        
    private readonly ComboBox myComboBox = new ComboBox();
    public MyForm()
    {
        var manyItems = Enumerable.Range(1, 66_000)
            .Select(t => new
            {
                Key = t,
                Value1 = t.ToString(),
                Value2 = t.ToString() + t.ToString()
            })
            .ToList();
        myComboBox.DataSource = manyItems;
        myComboBox.ValueMember = "Key";
        myComboBox.DisplayMember = "Value2";
        this.Controls.Add(myComboBox);
    }
}
READ ALSO
Подсчитать сколько выведенных пар?

Подсчитать сколько выведенных пар?

подскажите пожалуйста как вывести в консоль количество пар, а не их имя?

197
Периодическая очистка БД SQLite C#

Периодическая очистка БД SQLite C#

ПосоветуйтеИмею приложение с БД SQLite, в БД хранятся события

198
Как правильно предать datacontext из одного окна в другое

Как правильно предать datacontext из одного окна в другое

Всем здравствуйте, встала проблема, в моем приложении в датагрид есть данные, при клике на строку я открываю новое окно, но как сделать правильно...

167
Создание Instance для доступа c#

Создание Instance для доступа c#

Доброго времени суток

163