![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
Нужно написать класс с асинхронными методами, пораждающими при работе асинхронные эвенты.
Например MyAsyncClass содержит AsyncMethod, который можно запускать многократно с разными параметрами без остановки. А эвенты не требуют invoke к потоку формы, чтобы в обработчике сразу можно было менять свойства компонентов формы, т.е. можно передавать ещё в параметры AsyncMethod ссылку на родительский поток формы или что-то в этом роде... HELP! Это сообщение отредактировал(а) Ch0bits - 23.6.2006, 19:23 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Для вызова метод асинхронно через делегат - создаём экземпляр делегата и дёргаем BeginInvoke. Для того, чтобы по завершении Invoke выполнился наш "завершающий" метод - передаём в BeginInvoke делегат на свой метод (callback). Этот метод может делать что угодно, но обязан вызвать EndInvoke того же делегата. А с формой работать можно из любого потока, используя Control.Invoke и любой свой делегат.
З.Ы. проблемы могут начаться тогда, когда метод в другом потоке работает долго, и форма уже закрыта, а он обращается к её свойствам - вот это действительно проблемы, доложу я вам, и иногда даже приходится делать lock на Closing формы, чтобы не напороть исключений... -------------------- ![]() |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
оффтоп немного: у меня вообще такое желание, чтобы в языке сделали не lock, а unlock, т.е. чтобы все операции над объектом были поумолчанию потокобезопасными. как только поток начинает работать с объектом, сразу lock. а если уж взялся с потоками мучаться, вот тогда будь добр думай, где разрешать одновременный доступ. скорость выполения и первоначальной разработки конечно упадёт для многопоточных приложений, но и ошибок в дальнейшем на порядок меньше будет. такое моё мнение. Добавлено @ 09:29 кстати, а чем вы себе такий юзербанеры делаете? -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
оффтоп: поищи где-то в флейме или в обсуждении форума... или можешь ссылку на картинку у меня стянуть -------------------- ![]() |
|||
|
||||
| Ch0bits |
|
||||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
Задача немного изменилась: мне выгоднее использовать очередь, чем плодить кучу параллельных потоков.
Вот наконец дошли руки дописать: Сам класс:
Пример использования:
Принимаю предложения по оптимизации... |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Можно воспользоваться классом ThreadPool, потому что создание потока - операция относительно ресурсоёмкая. Тогда можно избавиться и от двух очередей (ThreadPool.QueueUserWorkItem позволяет поставить в очередь вызов с произв. параметрами - state). Тогда сократится количество lock-ов. Последнее замечание: если асинхронно вызывать у контрола (через BeginInvoke()) какую-л. операцию, есть шанс что контрол будет уничтожен в то время, как вызываемый метод ещё не доработал до конца - например, AC_ElementalWorkCompleted может пытаться добавить элемент в листбокс в то время, как форма уже закрылась и AC.Dispose() отработал.
-------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |