Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Я написал базовый класс Worker 
:(
    Опции темы
Dims
Дата 27.10.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Посмотрите, правильно ли я написал базовый класс Worker с использованием делегатов?

Код

class Worker
    {
        private bool working = false;
        private bool shouldstop = false;
        private Work work;
        private AsyncCallback done;
        
        public Worker()
        {
            work = new Work(Work);
            done = new AsyncCallback(Done);
        }

        bool Working
        {
            get
            {
                return working;
            }
        }
        bool ShouldStop {
            get
            {
                lock (this)
                {
                    return shouldstop;
                }
            }
            set
            {
                lock (this)
                {
                    shouldstop = value;
                }
            }
        }

        public void Start()
        {
            work.BeginInvoke(done, null);
        }
        
        private void Work()
        {
            shouldstop = false;
            working = true;
            SpecificWork();
            working = false;
        }
        
        protected virtual void SpecificWork();

        protected virtual void Done(IAsyncResult ar)
        {

        }
    }

    delegate void Work();


По моим представлениям, наследник должен имплементить SpecificWork и (необязательно) Done. Внутри SpecificWork нужно проверять ShouldStop.get на предмет не пора ли завершиться.

Пользователь может вызвать Start  чтобы запустить поток, может вызвать ShouldStop = true чтобы мягко приказать ему завершиться и может проверять Working на предмет того, работает ли ещё поток фактически.
PM MAIL   Вверх
PashaPash
Дата 28.10.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Dims, а как же стандартный System.ComponentModel.BackgroundWorker?



--------------------
PM MAIL WWW   Вверх
Dims
Дата 28.10.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Во-первых, я про него не знал smile
Во-вторых вопрос потренироваться с делегатами.

Я короче понял, что делегат это вовсе никакой не указатель на функцию, а скорее класс-обёртка.
PM MAIL   Вверх
rooks
Дата 28.10.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.9.2008
Где: Минск

Репутация: нет
Всего: 9



Цитата(Dims @ 28.10.2008,  00:39)
Я короче понял, что делегат это вовсе никакой не указатель на функцию, а скорее класс-обёртка.

так оно и есть) http://msdn.microsoft.com/en-us/library/96b1ayy4.aspx :
Цитата
All delegates inherit from MulticastDelegate, which inherits from Delegate. The C#, Visual Basic, and C++ languages do not allow inheritance from these types, instead providing keywords for declaring delegates.

PM MAIL ICQ   Вверх
jonie
Дата 30.10.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата
Внутри SpecificWork нужно проверять ShouldStop.get


Dims спорю на пиво, что класс наследник не сможет проверить ? у вас он private.
могу запустить (вызвать start) много раз.

по мне так стоит сделать не так...
зачем аждый раз это наследовать? чтобы перегрузить 2-3 функции ?
берем этот класс, делаем его sealed. что надо относительно потоков делаем в нем, и также делаем интерфейс "задача", который и будет "выполняеться" в другом потоке...
хотя это все отдает BackgroundWorker-ом чет 8-)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dims
Дата 3.11.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Цитата(jonie @  30.10.2008,  00:21 Найти цитируемый пост)
берем этот класс, делаем его sealed. что надо относительно потоков делаем в нем, и также делаем интерфейс "задача", который и будет "выполняеться" в другом потоке...

А можно поподробнее?

Конечно, в моём коде были ошибки. Сейчас я их исправил.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0802 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.