private void DoWork(SmashContext tparam)
        {
            System.Threading.ManualResetEvent startEvent = tparam.StartEvent;
            System.Threading.Interlocked.Increment(ref _taskReadyCount);
            if (!startEvent.WaitOne())
            {
                throw new SmashException(string.Format("Thread #{0} fail to start", tparam.ThreadNo));
            }

            SmashStopwatch swTask = new SmashStopwatch(tparam.NumIterations);

            SmashResult result = new SmashResult();

            result.SuccessfulIterations = 0;
            for (int i = 0; i < tparam.NumIterations; ++i)
            {
                if (tparam.SmashFunc(tparam.ThreadNo, i))
                {
                    result.SuccessfulIterations++;
                }
            }
            swTask.Done();

            SmashAssert.AreEqual(tparam.NumIterations, result.SuccessfulIterations);
            result.TimeTaken  = swTask.Elapsed;
            result.RatePerSec = swTask.RatePerSec;

            tparam.Manager.SubmitResult(tparam.ThreadNo, result);
        }
        public void Enqueue(int iterationPerThread, Func <int, int, bool> smashFunc)
        {
            var ctx = new SmashContext()
            {
                Manager       = this,
                ThreadNo      = this._threads.Count + 1,
                NumIterations = iterationPerThread,
                StartEvent    = this._startEvent,
                SmashFunc     = smashFunc
            };

            TotalIterations += iterationPerThread;
            _threads.Add(new Thread(() => DoWork(ctx)));
        }