同时启动多个线程并对其进行单元测试

Start multiple threads at same time and UnitTest it

我想知道如何测试 运行 的代码实际上是在同一时间开始的...

这里有一段代码:

var threads = new List<Thread>
{
  new Thread(() => Call1stFunc()),
  new Thread(() => Call2ndFunc())
}
threads.ForEach(t => t.Start());              
threads.ForEach(t => t.Join());

如何对其进行单元测试并验证线程是否同时执行?
如果我的代码有误,我怎么知道执行此类任务的正确代码是什么?

您不能完全同时启动线程,并且执行顺序未确定。但是您可以使用同步结构来同步您的线程。例如,使用 ManualResetEventSlim 强制您的线程等待它设置。

对于单元测试,您可以使用线程号和时间标记。只需将它们存储在列表中,然后将开始时间与增量进行比较。

static void Main(string[] args)
{
    var ids = new[] { "1", "2", "3" };

    var manualResetEventSlim = new ManualResetEventSlim();

    foreach (var id in ids)
    {
        var thread = new Thread((obj) =>
        {
            Console.WriteLine(string.Format("thread {0} strated", obj as string));
            manualResetEventSlim.Wait();
            Console.WriteLine("thread {0} work in progress", obj as string);
        });

        thread.Start(id);
   }

   Console.ReadKey();

   manualResetEventSlim.Set();

   Console.ReadKey();

}