1

C# XNA 4.0 を使用すると、常に false が返されるため、コードに助けが必要です

私の Game1.cs で、このコードを実行します

if (!Connection.sendPacketBool("Check", versionPacket))
        {
            Connection.closeConnection();
            this.Exit();
        }

私のクラス接続では、これを持っています

public static bool final;
public static bool sendPacketBool(String type, String data)
    {
        try
        {
            NetworkComms.SendObject(type, serverIp, serverPort, data);
            NetworkComms.AppendGlobalIncomingPacketHandler<string>("ClientV",
           (header, connection, array) =>
           {
               if (array == "false")
               {
                   final = false;
               }
               else
               {
                   final = true;
               }
           });
        }
        catch (Exception ex)
        {

        }
        if (!final)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

私がそうするときを除いて、物事は最終的です常に偽です

        public static bool final = true;

true または false を返すようにこのコードを変更するにはどうすればよいですか? できない

if (array == "false")
               {
                   final = false;
                   return false;
               }
               else
               {
                   final = true;
                   return true;
               }

エラーが出るので

NetworkComms.AppendGlobalIncomingPacketHandler は void を返します。return キーワードの後に​​オブジェクト式を続けてはなりません

ありがとう

4

1 に答える 1

4

問題は、設定するコードがfinalコールバックで発生し、非同期であることです。同期プロパティ内で値を返しています。

そのため、プロパティ ゲッターが返された後finalに設定されます。

Task<bool>C# (4+) でこれを処理する慣用的な方法は、bool の代わりに aを返すことです。これにより、コールバックの完了時に bool が設定されたオブジェクトを返すことができます。これは次のように記述できます。

public static Task<bool> SendPacketBoolAsync(string type, string data)
{
    var tcs = new TaskCompletionSource<bool>();
    try
    {
        NetworkComms.SendObject(type, serverIp, serverPort, data);
        NetworkComms.AppendGlobalIncomingPacketHandler<string>("ClientV",
           (header, connection, array) =>
           {
              if (array == "false")
              {
                 tcs.TrySetResult(false);
              }
              else
              {
                 tcs.TrySetResult(true);
              }
           });
    }
    catch (Exception ex)
    {
         tcs.TrySetException(ex);
    }

    return tcs.Task;
}
于 2013-07-23T17:15:05.970 に答える