public override Object Execute(Object o, IList args)
		{			
			// the runner will automatically kill the thread on disposal
			using(ThreadCollectionRunner runner = new ThreadCollectionRunner())
			{			
				// create threads
				ArrayList starters = new ArrayList();
				for(int i = 0;i<this.Count;++i)
				{
					// run test
					ThreadedRunInvokerStarter starter = new ThreadedRunInvokerStarter(
						this.Invoker,
						o,
						args
						);
					starters.Add(starter);
					runner.Threads.Add(new ThreadStart(starter.Run));
				}
			
				// launch
				runner.StartAll();
				runner.WaitForFinishingSafe();

                // Now that we are done running, check to see if any exceptions were thrown.
                // NOTE: This only reports the first thread that failed.
                foreach ( ThreadedRunInvokerStarter starter in starters )
                {
                    if ( starter.HasThrown )
                    {
                        throw new Exception( "Runner throwed.", starter.Exception );
                    }
                }
			}

			return null;
        }
        public override Object Execute(Object o, IList args)
        {
            // the runner will automatically kill the thread on disposal
            using(ThreadCollectionRunner runner = new ThreadCollectionRunner())
            {
                // create threads
                ArrayList starters = new ArrayList();
                for(int i = 0;i<this.Count;++i)
                {
                    // run test
                    ThreadedRunInvokerStarter starter = new ThreadedRunInvokerStarter(
                        this.Invoker,
                        o,
                        args
                        );
                    starters.Add(starter);
                    runner.Threads.Add(new ThreadStart(starter.Run));
                }

                // launch
                runner.StartAll();
                while(runner.AnyAlive)
                {
                    foreach(ThreadedRunInvokerStarter starter in starters)
                    {
                        if (starter.HasThrown)
                        {
                            runner.WaitForFinishingSafe();
                            throw new Exception("Runner throwed.",starter.Exception);
                        }
                    }
                }
            }

            return null;
        }