2

私は最近、小さな問題があることを除いて、新しいプロジェクトを「終了」しました。結果が返ってきません。

このプロジェクトは、SOAP クライアントを介してリクエスト クラスとレスポンス クラスと共に C# Web サービスを利用します。このプロジェクトは、何かを予約するように設計されています。このデモでは、映画館の座席を予約します。ただし、データが Windows フォーム クライアントから Web サービスに渡されると、何も返されません。最近、Web メソッドの実行時にプロジェクトがフリーズするのを止めました。

これは、Web サービスを呼び出すメソッドです (メソッド シグネチャは一時的なものです)。

public void derp()
{
    var client = new SampleServiceSoapClient();
    var req = new GetReservationRequest();
    req.row = row;
    req.seat = seat;
    req.name = textNameRequest.Text;
    try
    {
        client.GetReservation(req);
    }
    catch (Exception err)
    {
        MessageBox.Show("Server Unavailable");
    }
}

クラッシュを止めるために、このメソッドを別のスレッドで実行しています。このメソッドの出力は、応答オブジェクトを介して返されるはずであり、そのオブジェクトの値をフォームのテキスト ボックスに割り当てます。ただし、データは戻る前に失われます。

Web の方法は次のとおりです。

[WebMethod]
public GetReservationResponse GetReservation(GetReservationRequest req)
{
    object o = HttpContext.Current.Cache["Reservation"];
    if(o == null)
    {
        o = reservedSeat;
    }
    else
    {
        reservedSeat = (bool[,])o;
    }

    GetReservationResponse resp = new GetReservationResponse();
    string rowHolder = "A";
    int rowRequest = req.row;
    int seatCopy = 0;

    bool emptySeat = false;
    while (rowRequest < 12)
    {
        for (int seat = req.seat; seat < 16; seat++)
        {
            if (reservedSeat[req.row, seat])
            {
             //Loop back
            }
            else
            {
                emptySeat = true;
                seatCopy = seat;
                break;
            }
        }
        if (reservedSeat[req.row, 15])
        {
            seatCopy = 0;
            break;
        }
    }
    switch (rowRequest)
    {
        case 1: rowHolder = "A";
            break;
        case 2: rowHolder = "B";
            break;
        case 3: rowHolder = "C";
            break;
        case 4: rowHolder = "D";
            break;
        case 5: rowHolder = "E";
            break;
        case 6: rowHolder = "F";
            break;
        case 7: rowHolder = "G";
            break;
        case 8: rowHolder = "H";
            break;
        case 9: rowHolder = "I";
            break;
        case 10: rowHolder = "J";
            break;
        case 11: rowHolder = "K";
            break;
        case 12: rowHolder = "L";
            break;
        default: rowHolder = "None Specified";
            break;
    }
    int x = 0;
    if (!reservedSeat[rowRequest, seatCopy])
    {
        reservedSeat[rowRequest, seatCopy] = true;
        seatCopy++;
        //resp.row = rowRequest;
        x = seatCopy;
        seatCopy--;
        if (seatCopy.Equals(15))
        {
            rowRequest++;
        }
    }
    resp.row = rowHolder;
    resp.seat = x;   
    //row++            
    return resp;
}

戻ってくる前にデータが失われている理由はわかりませんが、驚くべき情報がいくつかあります...

4

1 に答える 1

0

このコードのrowrequestはどこでインクリメントされますか? ここに無限ループがあるように思えます:

        while (rowRequest < 12)
        {
                for (int seat = req.seat; seat < 16; seat++)
                {
                    if (reservedSeat[req.row, seat])
                    {
                    //Loop back
                    }
                    else
                    {
                        emptySeat = true;
                        seatCopy = seat;
                        break;
                    }
            }
            if (reservedSeat[req.row, 15])
            {
                seatCopy = 0;
                break;
            }
        }
于 2012-11-19T03:44:26.467 に答える