我的代码需要一些帮助,因为它总是返回false,使用C#XNA 4.0
在我的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 a return关键字后面不能跟一个对象表达式
由于
答案 0 :(得分:4)
问题是您的代码设置final
发生在回调中,并且是异步的。您将在同步属性中返回值。
因此,在返回属性getter之后,final
设置为。
在C#(4+)中处理此问题的惯用方法是返回Task<bool>
而不是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;
}