Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 13:48   #1
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию Не будет ли ошибкой использовать инвок для случаев, когда он не требуется?

Можно ли вместо такого кода
Код:
void Set1(string newText)
        {
            if (this.label1.InvokeRequired) this.label1.BeginInvoke(new Action<string>((s) => this.label1.Text = newText), newText);
            else this.label1.Text = newText;
        }
написать так
Код:
void Set1(string newText)
        {
            this.label1.BeginInvoke(new Action<string>((s) => this.label1.Text = newText), newText);
        }
и не будет ли ошибкой использовать инвок для случаев, когда он не требуется?
gramp вне форума Ответить с цитированием
Старый 18.04.2012, 16:10   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Во-первых, вызов Invoke медленнее обычного присвоения, и по возможности лучше обойтись без него. Во-вторых, если ты вызовешь Invoke до того, как создан хэндл окна (например, из конструктора формы), то Invoke вылетит с исключением.
ds.Dante вне форума Ответить с цитированием
Старый 18.04.2012, 18:41   #3
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Спасибо за ответ!
При асинхронной обработке событий без инвоков нереально обойтись или реально?
Правильно ли я понимаю, что BeginInvoke делает присвоение в асинхронном режиме и поэтому, несмотря на более медленное, чем обычное присвоение, не задержит другие потоки?
gramp вне форума Ответить с цитированием
Старый 18.04.2012, 19:02   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от gramp Посмотреть сообщение
При асинхронной обработке событий без инвоков нереально обойтись или реально?
Полагаю, если б реально было обойтись без invoke, все обходились бы без него.
Upd: что-то пишут про WindowsFormsSynchronizationContext. Надо будет копнуть поглубже.

Цитата:
Сообщение от gramp Посмотреть сообщение
Правильно ли я понимаю, что BeginInvoke делает присвоение в асинхронном режиме и поэтому, несмотря на более медленное, чем обычное присвоение, не задержит другие потоки?
Напрямую изменять свойства контролов нельзя из-за ограничений внутренней реализации Windows Forms. Не осилили MS многопоточности форм.

Отличие Invoke от BeginInvoke в том, что первый задерживает текущий поток (который вызывает invoke). Это нужно, когда возможны баги синхронизации, если дальше по коду изменяются те же контролы, что и внутри вызова invoke. Но в большинстве случаев достаточно вызывать BeginInvoke, который работает быстрее из-за отсутствия блокировки.

Последний раз редактировалось ds.Dante; 18.04.2012 в 19:11.
ds.Dante вне форума Ответить с цитированием
Старый 18.04.2012, 20:41   #5
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Благодарю!
gramp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматизировать подсчет количества случаев nike64n Microsoft Office Excel 4 13.01.2012 18:16
Написать программу, которая будет использовать ранее созданную библиотеку. sanya94 Общие вопросы C/C++ 3 19.02.2011 00:58
сортировка, когда невозможно использовать свойства таблицы IndexFieldName Римма БД в Delphi 5 07.09.2007 10:56
Как узнать когда браузер скачивает, а когда нет? iPod Работа с сетью в Delphi 1 07.05.2007 15:16