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

单元测试中经常需要对[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 @   蜡笔小王  阅读(1412)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示