0

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が返されます
。コードの問題は何ですか?

4

2 に答える 2

1

として宣言myQueuestaticます。( )呼び出しごとstatic Queue myQueue = new Queue();にの新しいインスタンスが作成されるように見えるため。Service1

于 2013-03-16T20:56:48.560 に答える
1

I4Vが言ったように、staticはその役割を果たしますが、同時発信者から保護するようにしてください。宣言によりインスタンスが使用できるようになることが保証されるため、プッシュ内で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();
于 2013-03-16T21:15:08.330 に答える