2015-10-28 2 views
1

Я понимаю, что обновление пользовательского интерфейса из другого потока требует вызова, но это вызов также требуется при простом чтении данных из пользовательского интерфейса?Требуется ли чтение данных из потока пользовательского интерфейса?

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

Если нет, то почему бы и нет?

Есть ли проблемы с производительностью? Лучше ли кэшировать все данные в массив (или datatable), а затем запускать вычисления или вызывать сетку каждый раз, когда данные считываются (например, в каждой строке)?

Я специально спрашиваю о VB.NET, хотя я сомневаюсь, что на любом другом языке .NET есть большая разница.

+1

Вы не должны задавать этот вопрос. Какую ценность вы ожидаете получить, когда ваш поток прочитает свойство в совершенно случайный момент времени? Может быть что угодно, когда вы разрешаете пользователю продолжать редактирование содержимого сетки. Может быть введено половину введенного значения. Вы воскликнете: «Я отключу сетку!» Да, что это хорошая идея. Но тогда вам больше не нужно решать эту проблему, так как вы можете просто прочитать нужные вам значения * до того, как вы начнете поток. –

+0

Вы правы, я могу прочитать сетку перед ее запуском, поэтому я спросил о производительности между этими двумя методами, если invoke не требуется. Однако зачем читать значения в другой таблице в памяти, если таблица в пользовательском интерфейсе уже содержит значения? Это тяжело и требует много времени для больших столов. – DrCocoa

+0

Пользовательский интерфейс не является «таблицей». Разделение данных с точки зрения является универсальным программным подходом со многими преимуществами. –

ответ

1

Все зависит от элемента управления, некоторые могут позволить вам читать из неинтерфейса, некоторые из них могут отсутствовать.

Лучшее решение проблемы - не читать непосредственно из элемента управления, иметь некоторый объект поддержки, который хранит данные, а затем использовать привязку, чтобы элемент управления использовал данные из вспомогательного объекта. Это основная предпосылка за MVVM (модель, вид, модель просмотра), очень популярный шаблон в WPF, но также можно использовать в Winforms.

0

№. Invoke требуется для обновления пользовательского интерфейса, так как пользовательский интерфейс может обновляться только из потока переднего плана. Нет ограничений относительно того, какой поток может читать данные.

Смежные вопросы