Исполнение не ожидает условия - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь получить результат использования метода в другом вызове.

Var 'AuthToken' будет установлен с событием, максимум 500 мс после того, как я подключусь к authSocket

Я пытался использовать 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 Ответ

3 голосов
/ 09 марта 2019

код продолжается до 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...