单元测试启动多线程并行处理的简单方法

单元测试中经常需要对[ThreadStatic]以及一些互斥环境的处理进行简单验证,启动并行处理方法很多,这里介绍一个简单的方法。

 

代码
static void Parallel(params ThreadStart[] actions)
{
    List
<Thread> threads = actions.Select(a => new Thread(a)).ToList();
    threads.ForEach(t 
=> t.Start());
    threads.ForEach(t 
=> t.Join());
}


下面是一个完整的例子:

代码
using System.Collections.Generic;
using System.Linq;

using System.Threading;
using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace VisionLogic.Training.ParallelUnitTesting
{
    [TestClass]
    
public class ObjectWithIdentifierFixture
    {
        [TestMethod]
        
public void TestPerThreadExecution()
        {
            Parallel(
                
delegate { ThreadInternalA(); },
                
delegate { ThreadInternalB(); }
                );
        }

        
void ThreadInternalA()
        {
            WriteLine(
"a1");
            Thread.Sleep(
2000);
            WriteLine(
"a2");
        }

        
void ThreadInternalB()
        {
            WriteLine(
"b1");
            Thread.Sleep(
1000);
            WriteLine(
"b2");
        }

        
#region Helper Methods

        
static void WriteLine(string message)
        {
            Trace.WriteLine(
string.Format("thread {0} : {1}", Thread.CurrentThread.ManagedThreadId, message));
        }

        
static void Parallel(params ThreadStart[] actions)
        {
            List
<Thread> threads = actions.Select(a => new Thread(a)).ToList();
            threads.ForEach(t 
=> t.Start());
            threads.ForEach(t 
=> t.Join());
        }

        
#endregion
    }
}


执行结果可以从Output窗口看到,大致如下:(这里采用TestDriven.NET执行)

------ Test started: Assembly: ParallelUnitTesting.dll ------

thread 13 : a1
thread 14 : b1
thread 14 : b2
thread 13 : a2

1 passed, 0 failed, 0 skipped, took 2.86 seconds (Ad hoc).

注意:这里没有使用 delegate.BeginInvoke 是因为它可能使用线程池,导致并没有实际启动多个线程。

 

posted @ 2010-05-11 16:05  蜡笔小王  阅读(1412)  评论(0编辑  收藏  举报