Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Я написал базовый класс Worker


Автор: Dims 27.10.2008, 22:25
Посмотрите, правильно ли я написал базовый класс 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 на предмет того, работает ли ещё поток фактически.

Автор: PashaPash 28.10.2008, 00:01
Dims, а как же стандартный System.ComponentModel.BackgroundWorker?

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

Я короче понял, что делегат это вовсе никакой не указатель на функцию, а скорее класс-обёртка.

Автор: rooks 28.10.2008, 22:03
Цитата(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.

Автор: jonie 30.10.2008, 00:21
Цитата
Внутри SpecificWork нужно проверять ShouldStop.get


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

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

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

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

Конечно, в моём коде были ошибки. Сейчас я их исправил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)