首页 新闻 赞助 找找看

WebApi 能否设置多线程共享变量

0
悬赏园豆:20 [已解决问题] 解决于 2018-01-20 11:13

在WebApi的Controller类里面,定义了一个static类型的类,以此想让多个请求,共享这个类里的数据。但事实,不同的请求,并没有共享它。应该怎么做?

Shendu.CC的主页 Shendu.CC | 老鸟四级 | 园豆:2138
提问于:2018-01-19 16:34
< >
分享
最佳答案
0

贴下你这个static类的代码及外边如何使用的

收获园豆:10
Daniel Cai | 专家六级 |园豆:10424 | 2018-01-19 17:06
  static class Queue
        {
            //长度为1000的队列
            public static Document[] blogpostZzkDoc = new Document[1000];
            //首指针,尾指针
            public static int rear, front;
            //入队列
            public static Document[] temporary = new Document[50];

            public static void init()
            {
                for (int i = 0; i < 1000; i++)
                    blogpostZzkDoc[i] = new Document();
                for (int i = 0; i < 50; i++)
                    temporary[i] = new Document();

                rear = 0;
                front = 0;
            }
            public static void push(Document[] post, int len)
            {
                for (int i = 0; i < len; i++)
                {
                    rear = (rear + 1) % 1000;
                    if (rear == front)
                    {
                        while (true)
                        {
                            if (rear != front)
                                break;
                            Thread.Sleep(3000);
                            System.Console.WriteLine("数据已经满了,插不进去了");
                        }
                    }
                    postDoc[rear] = post[i];
                }
                System.Console.WriteLine("我又插入了 " + len.ToString() + "个数据, 现在尾指针已经到了" + rear.ToString() + "头指针已经到了" + front.ToString());
            }

            //出队列
            public static Document[] pop(int len)
            {
                int j = 0;
                while (front != rear)
                {
                    temporary[j++] = postDoc[front];
                    front = (front + 1) % 1000;
                    if (j == len)
                    {
                        System.Console.WriteLine("数据已经被取空了");
                        break;
                    }

                }
                System.Console.WriteLine("我取出了了 " + j.ToString() + "个数据, 现在尾指针已经到了" + rear.ToString() + "头指针已经到了" + front.ToString());
                return temporary;
            }
        }

上面是我要共享的类以及变量

下面是,Controller的函数调用

    [HttpGet("api/getdata")]
        public void Get()
        {

            Queue.init();
        

            GetData();
          
        }


      
        [HttpGet("api/write")]
        public void write()
        {

         

            Write();
        }

两个函数的操作:

  public void  GetData()
        {
            int len = 50;
            Document[] s = new Document[len];
            int start = 1;
            while (true)
            {
               
                s = post.getData();
              
                Queue.push(s, s.Length);

                if (s.Length == 0)
                    break;
            }

        }
  public void Write()
        {
            int len = 50;
            Document[] s = new Document[len];
            List<Dictionary<string, string>> doc = new List<Dictionary<string, string>>();
        
            while (Queue.front != Queue.rear)
            {
                s = Queue.pop(len);
                int l = s.Length;
                for (int i = 0; i < l; i++)
                {
                    doc.Add(ToMap(s[i]));
                }

            
                _service.Write(doc.Select(p => new DocDto(p)));

                if (Queue.front >= Queue.rear)
                    break;

            }
        }

 

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-01-19 17:23

就是,一个请求是往队列里面写入数据,一个请求是往队列里面拿出数据。然后两个请求不能共享一个队列。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-01-19 17:24

我找到问题的关键了,是我的队列写的有问题!

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-01-19 17:40
其他回答(1)
0

用第三方缓存 redis ,轻轻松松实现

收获园豆:10
悟行 | 园豆:12559 (专家六级) | 2018-01-19 17:17

我的共享资源其实就是一个队列,但是redis是一个key/value 结构,没办法实现我想要的。

支持(0) 反对(0) Shendu.CC | 园豆:2138 (老鸟四级) | 2018-01-19 17:27

@Shendu.cc: redis 的list类型可以做消息队列

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2018-01-22 09:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册