Время медленной установки привязки данных в C # .NET 4.0 - PullRequest
2 голосов
/ 07 мая 2010

У меня проблема.У меня есть приложение Windows Forms с динамически создаваемым макетом, но у меня проблема с производительностью.В этой форме я использую DataBinding из .NET 4.0 и привязка данных после установки работает нормально, но он привязывает время установки для ONE управления, блокирующего мое приложение примерно на 0,7 секунды. У меня есть некоторыеУправление и время настройки Binging составляют около 2 минуты .

Я пробую все возможные решения, у меня нет никаких идей без написания самосвязывающего класса.Почему не так с моим кодом?

case "Boolean":
{
    Binding b = new Binding("Checked", __bindingsource, __ep.Name);
    CheckBox cb = new CheckBox();

    /*
     * HERE is the start of problem
     */

    cb.DataBindings.Add(b);

    /*
     * HERE is the end of problem
     */

    __flp.Controls.Add(cb);
    __bindingcontrol.AddBinding(b);
    break;
}

Без проблемных строк кода все работает быстро и без привязки ;-( но я хочу, чтобы привязка включалась с нормальной скоростью.

PS1. Я приостановилмакет во время генерации.

PS2. У меня та же проблема с привязкой TextBox'es, PictureBoxe's, CheckBox является лишь примером.

Как это сделать или, более того, маленький, как отладить проблему,Профилировщик vs2010 говорит, что только проблема связана с привязкой, и я знаю, что.

  1. System.Windows.Forms.Control.ControlCollection.Add (класс System.Windows.Forms.Control)
  2. System.Windows.Forms.ControlBindingsCollection.Add (класс System.Windows.Forms.Binding)

РЕДАКТИРОВАТЬ: DataContext из базы данных. (Entity Framework)

Ответы [ 3 ]

2 голосов
/ 09 мая 2010

Не уверен, что это проблема в вашем случае, но привязка может занять много времени, если она вызовет «шторм событий».То есть вы привязываетесь к элементу управления A, который вызывает изменение в элементе управления B, который вызывает изменение в элементе управления A ....

Одна вещь, которую необходимо проверить, - это события на обновляемых элементах управления.

Другое дело, что из ваших комментариев похоже, что вы делитесь __bindingsource между формами.Это может быть корнем проблемы.Почему вы это делаете?Использование источника привязки для каждой формы сделает вашу программу более управляемой.

1 голос
/ 14 июня 2010

Это работает не быстро, потому что __bindingsource имеет много элементов. Binding плохо работает с большими коллекциями, и это проблема.

__bindingsource - это класс BindingSource. И должно быть гораздо меньше элементов для быстрой работы. Я решил эту проблему с созданием другого нового экземпляра BindingSource для каждого BindingSet (я имею в виду привязку разовых элементов к свойствам одного объекта) только с одним элементом, только это я и хочу использовать.

0 голосов
/ 16 мая 2010

У меня тоже была эта проблема. Я установил DataSourceUpdateMode на Never (в конструкторе класса Binding): тогда производительность была намного лучше. Если вам не нужно обновлять источник данных, это правильный путь.

Эта проблема производительности возникает из-за инициируемого события Validation. Даже если элемент управления теряет фокус или щелкается, запускается событие проверки, которое может значительно снизить производительность вашего приложения.

РЕДАКТИРОВАТЬ: Хотя я не привязывался к EntityFramework, производительность была очень плохой. Установка DataSourceUpdateMode на Never уменьшает количество событий. После установки DataSourceUpdatedMode на Never обновления будут однонаправленными: от источника данных к контролю.

...