Stress Testing without ACT

The official MS Tool to stress your apps is ACT, however it's not ready to test enterprise applications, basically I missed two things

  • Support to Client Certificates
  • Support to .NET languages

So, my decission is to build my own Thread based tester, of course in c#.  It's my first time I code using threads, so here is my first approach.

What I want is to call several times to the same method (without parameters, and returns void), the first step is to define a delegate like this:

public delegate void WorkerMethodDelegate();

Now I'm going to define a new class, that receives this delegate in the constructor:

public MultiThreadRunner(WorkerMethodDelegate m)

{

_method = m;

}

I need a public method "Run" that indicates how many threads should run this method:

public void Run(int times)

{

      _threads = new Thread[times];

      for (int i=0;i<times;i++)

      {

            _threads[i] = new Thread(new ThreadStart(_method));

            _threads[i].Start();

      }

                                   

}

To finish this class I need to know how long should I wait untill all my threads have finished, so I complete the Run method:

public void Run(int times)

{

      _threads = new Thread[times];

      for (int i=0;i<times;i++)

      {

            _threads[i] = new Thread(new ThreadStart(_method));

            _threads[i].Start();

      }

     

      bool finished = false;

      while (finished!=true)

      {

            finished = threadPoolFinished();

            Thread.Sleep(500);

      }

}

private bool threadPoolFinished()

{

      bool result = true;

      int numThreads = _threads.Length;

      for (int i=0;i<numThreads;i++)

      {

            result &= ( _threads[i].ThreadState == ThreadState.Stopped );

      }

      return result;

}

And that's it !!

I don't know how comformant is this code, but IT JUST WORKS.

I'm waiting for your comments  about how to improve this class, so  here is the complete class.

using System;

using System.Threading;

namespace PerfTestRunner

{

      public delegate void WorkerMethodDelegate();

      public class MultiThreadRunner

      {

            WorkerMethodDelegate _method;

            Thread[] _threads;

            public MultiThreadRunner(WorkerMethodDelegate m)

            {

                  _method = m;

            }

            public void Run(int times)

            {

                  _threads = new Thread[times];

                  for (int i=0;i<times;i++)

                  {

                        _threads[i] = new Thread(new ThreadStart(_method));

                        _threads[i].Start();

                  }

                 

                  bool finished = false;

                  while (finished!=true)

                  {

                        finished = threadPoolFinished();

                        Thread.Sleep(500);

                  }

            }

            private bool threadPoolFinished()

            {

                  bool result = true;

                  int numThreads = _threads.Length;

                  for (int i=0;i<numThreads;i++)

                  {

                        result &= ( _threads[i].ThreadState == ThreadState.Stopped );

                  }

                  return result;

            }

      }

}