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

擦…凑合一般8错牛B! (尚未评级)
Loading ... Loading ...

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);
            }
        }
    }

本文归类于 创造之风[原创]

留下回复