线程是否在Nunit中无法正常工作?

时间:2009-03-19 12:43:05

标签: multithreading nunit

我认为在涉及线程代码时,nunit功能不正常:

以下是示例代码:

public class multiply
{
    public Thread myThread;
    public int Counter
    {
        get;
        private set;
    }
    public string name
    {
        get;
        private set;
    }
    private Object thisLock = new Object();
    public void RunConsolePrint()
    {
        //lock(thisLock)
        //{
        Console.WriteLine("Now thread " + name + " has started");
        for (int i = 1; i<= Counter; i++)
        {
            Console.WriteLine(name + ": count has reached " + i+ ": total count is "+Counter);
        }
        Console.WriteLine("Thread " + name + " has finished");
        //}
    }
    public multiply(string pname, int pCounter)
    {
        name = pname;
        Counter = pCounter;
        myThread = new Thread(new ThreadStart(RunConsolePrint));
    }
}

这是测试代码:

[Test]
public  void Main()
{
    counter=100;

    multiply m2=new multiply("Second", counter);
    multiply m1 = new multiply("First", counter);
    m1.myThread.Start();
    m2.myThread.Start();

}

输出是m1m2的顺序运行,这意味着m1中的循环总是在{{1}之前执行至少那是我的测试所显示的。我跑了几次测试,我总是得到这个。

这是一个错误吗?还是预期的行为?

如果我将上述代码复制到控制台程序并运行,我可以清楚地看到线程效果。

我正在使用TestDriven.net跑步者进行测试。

2 个答案:

答案 0 :(得分:2)

无法真正预测两个或多个线程的确切交错。

您的示例需要考虑几个因素。首先,每个线程将在(可能)切换到另一个线程之前执行其量程。您不能指望在代码中的任何特殊位置发生线程切换。即一个线程可能在另一个线程启动之前完成(特别是因为在您的情况下任务相对较短)。

其次,由于您正在写入控制台,因此线程将在该访问上同步。这也会影响交错。

结果还取决于计算机上可用核心的数量(以及运行代码时计算机上的一般负载)。

简而言之,您无法预测两个线程的运行方式。

答案 1 :(得分:1)

m1m2首先开始执行是不确定的。如果计数器执行得足够快,我会不会惊讶地看到其中一个在另一个开始之前完成。将计数更改为非常大的数字(例如一百万),我很确定你会看到同时执行单独的线程。

任何结果都是可能的 - 你看到的结果是什么表明存在错误?