C#中的Random类一直返回0?!

  近期的一个项目需要一个后台进程来执行异步计算,于是用C#写了一个服务程序来完成这项工作。一开始一切正常,但几天后发现偶尔进程占用CPU100%,一些计算也没有完成,于是考虑到是某些意外的计算导致某个while的循环条件一直为真造成死循环,但是看了几次代码也没发现问题。本想调试方式看看问题出在哪里,但进入调试模式后又一切正常了,到底怎么办呢?实在没有办法,只能在实际运行环境的条件下进行远程调试了。

  终于,一天以后问题再度出现,附加到远程进程后问题真相大白:考虑这行代码 while( random.Next(5,10)<5 ) {} 本来不应该存在任何问题,但事实上Random.Next竟然返回0!仔细查看MSDN发现,Random类并不是线程安全的,也即是说,在多线程环境下,Random出现意外也是正常的。正好该服务是多线程环境,而Random被声明为static,在应用程序域内共享,导致多线程分享才出现意外。于是自己把Random做了封装,问题得以解决。代码如下:

[cc lang=”csharp”]
public class ThreadSafeRandom
{

private static Random random = new Random();

public static double NextDouble()
{

lock (random)
{

return random.NextDouble();

}

}

public static int Next(){

lock (random)
{
return random.Next();

}
}

public static int Next(int max)
{

lock (random)
{
return random.Next(max);

}
}

public static void NextBytes(byte[] buffer)
{

lock (random)
{
random.NextBytes(buffer);
}
}

public static int Next(int min,int max)
{

lock (random)
{

return random.Next(min,max);
}
}
}
[/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注