【问题标题】:Execution does not await for condition执行不等待条件
【发布时间】:2019-03-09 12:27:43
【问题描述】:

我正在尝试获取方法的结果以在不同的调用中使用。

var 'AuthToken' 将设置一个事件,在我连接到authSocket 后最多 500 毫秒

我尝试使用 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";
}

【问题讨论】:

    标签: c# async-await


    【解决方案1】:

    代码在GetAuthToken 甚至返回之前继续到gameSocket...

    不,抱歉,这是不可能的。在GetAuthToken 返回之前,发布的代码不会到达gameSocket。如果您看到这种情况,则可能是您多次致电 Init

    也就是说,Task.Delay 轮询循环是一种糟糕的方法。这是一种“信号”,所以我建议使用TaskCompletionSource&lt;string&gt; 而不是string。当授权令牌到达时,调用TrySetResult(...),您的消费代码可能如下所示:

    authSocket = new Client_Authenticate(_ip, Settings.SERVER_PORT);
    token = await authSocket.Task.ConfigureAwait(false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 2012-02-22
      • 2017-11-30
      • 2022-01-23
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多