使用web服务实现队列

本文关键字:队列 实现 服务 web 使用 | 更新日期: 2023-09-27 18:04:21

我想创建一个web服务队列。这是我的代码:

    public class Service1 : System.Web.Services.WebService
{

    Queue myQueue = new Queue();
    [WebMethod]
    public void push(int item)
    {
        if (myQueue == null)
            myQueue = new Queue();
        myQueue.Enqueue(item);
    }
    [WebMethod]
    public int pop()
    {
        if (myQueue != null)
        {
            if (myQueue.Count != 0)
            {
                return (int)myQueue.Dequeue();
            }
        }
            return -1;

    }
}

push()方法工作良好,但是当我调用pop()来检索数据时,它总是返回-1
我的代码有什么问题?

使用web服务实现队列

声明myQueuestatic。(static Queue myQueue = new Queue();),因为似乎Service1的一个新的实例是创建与每个调用。

正如I4V所说,静态可以完成这项工作,但要确保防止同时调用者。不需要在push中手动实例化myQueue,因为声明保证实例已准备就绪。

public class Service1 : System.Web.Services.WebService
{
    static Queue myQueue = new Queue();
    [WebMethod]
    public void push(int item)
    {
        lock(myQueue)
        {
            myQueue.Enqueue(item);
        }
    }
    [WebMethod]
    public int pop()
    {
        lock(myQueue)
        {
            if (myQueue.Count != 0)
            {
                return (int)myQueue.Dequeue();
            }
            return -1;
        }
    }
}

另外,考虑使用泛型队列,这样您就不必一直强制转换。它更安全,也更快。http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

// before class declaration
using System.Collections.Generic;
// replaces myQueue declaration
static Queue<int> myQueue = new Queue<int>();
// later, in pop - myQueue already returns ints, so no casting needed
return myQueue.Dequeue();