与N个并发线程并行运行作业

时间:2011-04-27 09:56:17

标签: c# unit-testing task-parallel-library

有时我需要一个测试方法由N个线程同时执行(就像在ASP.NET代码中发生的那样)。

使用Task Library是否有一种简单的方法可以做到这一点?

[TestMethod()]
public void DoSomethingTest()
{
    // Do something which has concurrency issues i.e. database, IO, ...
    DoSomething();
}

// Something like:

[TestMethod()]
public void DoSomethingTest()
{
    int n = 1000; // run 1000 of DoSomething() simultaneously
    Parallel.Invoke(() => DoSomething(), n);
}

2 个答案:

答案 0 :(得分:1)

是的,有一个Parallel.For:

[TestMethod()]
public void DoSomethingTest()
{
    int n = 10; // changed to 10, see comment
    Parallel.For(0, n, i =>  DoSomething());
    // here all threads are completed 
}

但请注意,TPL将决定并行数量,就像ASP.NET Threadpool ...

您可以添加ParallelOptions来设置并行度的degeree,但我不会。

答案 1 :(得分:0)

是的,我测试了一些与TPL平行的方法。

以下是一些示例代码:

var parent = Task.Factory.StartNew(() =>
            {
                var tasksI = Task.Factory.StartNew(() =>
                {
                    for (int i = 0; i < Constants.TaskCount; i++)
                        DoMethod1Parallel();

                });

                var tasksII = Task.Factory.StartNew(() =>
                {
                    for (int i = 0; i < Constants.TaskCount; i++)
                        DoMethod2Parallel()

                });

                tasksI .Wait();
                tasksII.Wait();
            });

            parent.Wait();
            Assert.AreNotEqual(parent.IsFaulted, "Executing is faulted!");

我多次调用Method1和Method2,并且TPL并行。所以我可以验证并行执行的能力!

问候,帕特里克