C# 返回带有if语句的bool
我需要一些代码方面的帮助,因为使用C#xna4.0,代码总是返回false 在Game1.cs上,我运行以下代码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
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,那么您可以使用一个延续-请参阅:非常感谢您,真的帮助了我!