Click here to Skip to main content
11,804,008 members (80,339 online)
Click here to Skip to main content
Add your own
alternative version

Dealing with Progressive Operations

, 10 May 2010 CPOL 18.8K 236 56
Through a clean OOP solution to deal with progressive operations, I will implicitly show you how OOP principles can work together to make a full, clean solution.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Erik.Utilities.Bases;
using Erik.Utilities.Interfaces;
using Erik.Utilities.Threading;

namespace Erik.Utilities.Bases
    public class BackgroundCompositePO:
        BaseProgressiveOperation, IAbortable
        Mutex _curStepMutex;
        AbortableThreadPool _pool;

        protected List<IProgressiveOperation> _operations;

        protected BackgroundCompositePO() 
            _curStepMutex = new Mutex(false);

        public BackgroundCompositePO(
            List<IProgressiveOperation> operations) : this()
            _operations = operations;
            _totalSteps = _operations.Sum<IProgressiveOperation>(po => po.TotalSteps);

        void CreateThreadPool()
            if (_pool != null)

            _pool = AbortableThreadPool.NewInstance();

            _pool.Aborted += (sender, e) => OnAborted(e);

        public override void Start()
            // If the operation is already running, this
            // will throw an InvalidOperationException
            // due to the invocation to its Dispose method

            _currentStep = 0;

            foreach (IProgressiveOperation po in _operations)
                po.OperationProgress +=
                    (sender, e) =>


        protected void RunOperation(IProgressiveOperation po)
            _pool.AddNewOperation(new ThreadStart(po.Start));

        protected void IncreaseCurrentStep()

            if (_currentStep == _totalSteps)
                Thread th = new Thread(new ThreadStart(DisposePool));


        void DisposePool()
            bool disposed = false;
            while (!disposed)
                    disposed = true;
                catch { Thread.Sleep(10); }

        protected virtual void OnAborted(EventArgs e)
            if (Aborted != null)
                Aborted(this, EventArgs.Empty);

        #region IAbortable Members

        public event EventHandler  Aborted;

        public void Abort()


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Technical Lead
Spain Spain
No Biography provided

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.151002.1 | Last Updated 10 May 2010
Article Copyright 2010 by _Erik_
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid