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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2017, 12:50   #1
mr.indieperson
 
Регистрация: 16.01.2017
Сообщений: 3
Сообщение [РЕШЕНО] Безопасность InvokeRequired

Здравствуйте, есть у меня вопрос по потокам, решил наконец его задать, для понимания сути. C#. Если нам нужно обратиться к контролу, созданному в основном потоке, из фонового, рекомендуется выполнять следующее:

Код:
if (mycontrol.InvokeRequired)
mycontrol.Invoke(бла бла в потоке контрола);
else {бла бла напрямую}
Так вот, здесь обнаруживается моё незнание (неуверенность) про то, как происходит переключение между выполняемыми на ядрах процессора потоками.
Данный фоновый поток может приостановиться после обращения к InvokeReqired с возвращением false и до Invoke, а после того, как продолжится выполнение, может получится так, что InvokeReqired стало true после некоторых событий в потоке контрола.
И вообще могут на разных выполняться процессорах основной и фоновый, и InvokeReqired может сменится сразу после его прочтения в фоновом потоке без всяких его приоcтановок.

Я прав?

Сам я всегда юзаю Invoke без проверки InvokeReqired именно потому, что до сих пор так и не убежден в безопасности этого.
Если я прав, стоит ли другую сделать защиту с помощью каких-то методов блокировки выполнения, или оставить всегдашний Invoke?

Решение в следующем сообщении

Последний раз редактировалось Вадим Мошев; 12.05.2018 в 18:57.
mr.indieperson вне форума Ответить с цитированием
Старый 16.01.2017, 13:13   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Он не будет false если вы вызвали из другого (не основного винформс) потока.
Он просто проверяет из какого потока вызван, можете просто сразу Invoke если этот код всегда выполняется в другом потоке.

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

Цитата:
true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.
https://referencesource.microsoft.co...ontrol.cs,2994
Цитата:
Код:
.........
return(hwndThread != currentThread);

Вообще обычно удобнее SynchronizationContext или в .NET 4.5 Progress<T>
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.01.2017 в 13:19.
Alex11223 вне форума Ответить с цитированием
Старый 16.01.2017, 13:31   #3
mr.indieperson
 
Регистрация: 16.01.2017
Сообщений: 3
По умолчанию

Ох, как всё просто оказалось. Аж глупо) Спасибо. Внимательней надо читать msdn, я его читал, но не видел это, думал оно по другому работает.
mr.indieperson вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безопасность Banananchik Операционные системы общие вопросы 2 28.02.2014 22:00
Безопасность БД Sparky Свободное общение 18 17.10.2012 15:18
Безопасность e_e_n Безопасность, Шифрование 40 03.09.2010 01:11
Безопасность e_e_n Безопасность, Шифрование 11 04.07.2010 06:47
Безопасность x_AN777 Помощь студентам 2 08.05.2010 23:30