C# 返回带有if语句的bool

C# 返回带有if语句的bool,c#,boolean,return,C#,Boolean,Return,我需要一些代码方面的帮助,因为使用C#xna4.0,代码总是返回false 在Game1.cs上,我运行以下代码 if (!Connection.sendPacketBool("Check", versionPacket)) { Connection.closeConnection(); this.Exit(); } 关于我的班级关系,我有一个 public static bool final; public st

我需要一些代码方面的帮助,因为使用C#xna4.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;
        }
    }
如何更改此代码以使其返回true或false?我做不到

if (array == "false")
               {
                   final = false;
                   return false;
               }
               else
               {
                   final = true;
                   return true;
               }
因为我得到了错误

NetworkComms.AppendGlobalIncomingPacketHandler返回无效的 return关键字后面不能跟对象表达式


谢谢

问题是设置
final
的代码发生在回调中,并且是异步的。您正在同步属性中返回值

因此,
final
是在返回属性getter之后设置的

在C#(4+)中处理这个问题的惯用方法是返回一个
任务
,而不是bool。这将允许您返回一个对象,该对象将在回调完成时设置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;
}
公共静态任务SendPacketBoolAsync(字符串类型,字符串数据)
{
var tcs=new TaskCompletionSource();
尝试
{
NetworkComms.SendObject(类型、服务器IP、服务器端口、数据);
NetworkComms.AppendGlobalIncomingPacketHandler(“ClientV”,
(标题、连接、数组)=>
{
如果(数组==“false”)
{
tcs.TrySetResult(假);
}
其他的
{
tcs.TrySetResult(真);
}
});
}
捕获(例外情况除外)
{
tSystexception(ex);
}
返回tcs.Task;
}

问题在于设置
final
的代码发生在回调中,并且是异步的。您正在同步属性中返回值

因此,
final
是在返回属性getter之后设置的

在C#(4+)中处理这个问题的惯用方法是返回一个
任务
,而不是bool。这将允许您返回一个对象,该对象将在回调完成时设置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;
}
公共静态任务SendPacketBoolAsync(字符串类型,字符串数据)
{
var tcs=new TaskCompletionSource();
尝试
{
NetworkComms.SendObject(类型、服务器IP、服务器端口、数据);
NetworkComms.AppendGlobalIncomingPacketHandler(“ClientV”,
(标题、连接、数组)=>
{
如果(数组==“false”)
{
tcs.TrySetResult(假);
}
其他的
{
tcs.TrySetResult(真);
}
});
}
捕获(例外情况除外)
{
tSystexception(ex);
}
返回tcs.Task;
}

在异常捕获块中放入一条打印语句,然后查看它是否打印。我怀疑您遇到了异常,这就是它从不更新的原因。请在异常捕获块中放入一条print语句,然后查看它是否打印。我怀疑你遇到了一个异常,这就是为什么它从不更新。我应该如何获得重新运行<代码>如果(!Connection.sendPacketBool(“Check”,versionPacket))
那不会work@AlvaroCarvajalNakosmai如果您使用的是VS 2012,async/await会使这变得很容易:
bool check=await Connection.SendPacketBoolAsync(“check,versionPacket”);If(!check){…}
@AlvaroCarvajalNakosmai然后您可以使用续集-请参阅:非常感谢您,真的帮助了我!我应该如何获得重新启动?
如果(!Connection.sendPacketBool(“Check”,versionPacket))
那是行不通的work@AlvaroCarvajalNakosmai如果您使用的是VS 2012,async/await会使这变得很容易:
bool check=await Connection.SendPacketBoolAsync(“check,versionPacket”);如果(!check){…}
@AlvaroCarvajalNakosmai,那么您可以使用一个延续-请参阅:非常感谢您,真的帮助了我!