C#中的Random类一直返回0?!
2009年09月20日 18时12分 希尔菲娅 361 次阅读
近期的一个项目需要一个后台进程来执行异步计算,于是用C#写了一个服务程序来完成这项工作。一开始一切正常,但几天后发现偶尔进程占用CPU100%,一些计算也没有完成,于是考虑到是某些意外的计算导致某个while的循环条件一直为真造成死循环,但是看了几次代码也没发现问题。本想调试方式看看问题出在哪里,但进入调试模式后又一切正常了,到底怎么办呢?实在没有办法,只能在实际运行环境的条件下进行远程调试了。
终于,一天以后问题再度出现,附加到远程进程后问题真相大白:考虑这行代码 while( random.Next(5,10)<5 ) {} 本来不应该存在任何问题,但事实上Random.Next竟然返回0!仔细查看MSDN发现,Random类并不是线程安全的,也即是说,在多线程环境下,Random出现意外也是正常的。正好该服务是多线程环境,而Random被声明为static,在应用程序域内共享,导致多线程分享才出现意外。于是自己把Random做了封装,问题得以解决。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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); } } } |
本文归类于 创造之风[原创]

