执行不等待条件

时间:2019-03-08 22:15:15

标签: c# async-await

我正在尝试获取要在其他调用中使用的方法的结果。

在连接到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";
}

1 个答案:

答案 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);