![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
HAL707 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 6.9.2007 Репутация: 1 Всего: 4 |
Всем известно, что при попытке обращения к элементам формы из другого потока небезопасно.
Для этого нужно юзать инвок методы формы или контролов. Но представим себе такую ситуацию. Разработчик пишет какой-то сложный и навороченный класс (назовем его model). У него в этом классе после создания начинают крутится несколько потоков. У класса есть событие OnModelChange (типа разработчик хочет информировать потребителя класса о том, что в моделе что-то произошло) Событие вызывает какой-то из внутриклассовых потоков. Ничего не подозревающий программист юзает этот класс в винаппликейшне. Подписывается на событие OnModelChange и в функции-обработчике события пишет что-то типа label1.Text = "Модель стартовала" Нажимает он значит кнопочку Play в Студии и видит эксепшн, т.к. обработчик события вызвал внутренний поток класса и т.к. там узаются контролы (label1) - это небезопасно. Но прогер то этого не знает, и ему вообще невдомек, что в классе есть отдельные потоки. Ну и начинает он искать причины ошибки, а потом ругать разработчика... Это все, я думаю, не есть хорошо. Встает вопрос, а можно ли как-то вызвать событие безопасно, но не передавая в класс ни формы, ни контролов (классу вообще параллельно где он используется). Т Есть мнения по этому поводу? |
|||
|
||||
Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 2 Всего: 18 |
Что-то я не совсем понял вас… Разработчик навороченного класса model должен позаботится о синхронизации.
|
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
HAL707, ес-но можно. Например, при создании модели запоминать System.Windows.Threading.Dispatcher для создавшего потока, и оборачивать вызов события в Invoke.
|
|||
|
||||
HAL707 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 6.9.2007 Репутация: 1 Всего: 4 |
Rohoss, что то меня последнее время никто не понимает...
PashaPash, можно пример? |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
HAL707,
|
|||
|
||||
HAL707 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 6.9.2007 Репутация: 1 Всего: 4 |
Спасибо, то что нужно
![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |