风精灵溪谷

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

2009-09-20 · 创造之风[原创] · 标签: .Net / 心得

近期的一个项目需要一个后台进程来执行异步计算,于是用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]


评论