我正在尝试获取要在其他调用中使用的方法的结果。
在连接到authSocket
后最多500毫秒内将为事件设置var'AuthToken'
我尝试使用async / await,但是在VS2017中逐步通过调试器时,代码仍会继续
gameSocket = new Client_TBDGame(...)
在authSocket.GetAuthToken(...)
甚至返回之前。
如果有人可以看看,那就太好了!也许对于我的问题存在完全不同的解决方案?
我有以下代码:
public static async Task<string> Init(string _ip)
{
if (!IsHostUp(_ip))
{
Debug.LogWarning("Cannot connect to Server!");
return "ERROR_SERVER_UNREACHABLE";
}
authSocket = new Client_Authenticate(_ip, Settings.SERVER_PORT);
token = await authSocket.GetAuthToken().ConfigureAwait(false);
// Connect to /game endpoint
gameSocket = new Client_TBDGame(_ip, Settings.SERVER_PORT, token);
return "SUCCESS";
}
Client_Authenticate
public async Task<string> GetAuthToken()
{
// Cancel after 15 tries and return "ERROR_TIMEOUT"
for (int i = 0; i < 15; i++)
{
if (AuthToken != null || AuthToken != "")
return AuthToken;
await Task.Delay(100);
}
return "ERROR_TIMEOUT";
}
答案 0 :(得分:3)
在
gameSocket...
甚至还没有返回之前,代码就继续GetAuthToken
。
不,对不起,那是不可能的。在gameSocket
返回之前,发布的代码将不会到达GetAuthToken
。如果看到这种情况,则可能有多个呼叫Init
。
也就是说,Task.Delay
轮询循环是一种糟糕的方法。这是一种“信号”,因此我建议使用TaskCompletionSource<string>
而不是string
。当身份验证令牌到达时,调用TrySetResult(...)
,您的使用方代码如下所示:
authSocket = new Client_Authenticate(_ip, Settings.SERVER_PORT);
token = await authSocket.Task.ConfigureAwait(false);