Дождитесь асинхронной функции в foreach - PullRequest
0 голосов
/ 20 декабря 2018

В моем проекте я пробую разные IP-адреса для подключения.Если я не могу подключиться, я переключусь на следующий Ip

foreach(var handler in webHandlers)
{
    if(handler.TryConnect())
    {
        handler.Init();
        break;
    }
}

Класс обработчика:

bool finished = false;
bool returnval = false;

public bool TryConnect()
{
    StartCoroutine(TryConnection);
    while(!finished) { }
    return returnval;
}
IEnummerator TryConnection()
{
    UnityWebRequest www = UnityWebRequest.Get("url");
    www.timeout = 5;
    yield return wwww.SendWebRequest();
    if(www.isNetworkError)
    {
        returnval = false;
    }
    {
        returnval = true;
    }
    finished = true;
}

Если соединение установлено, оно работает мгновенно.Но если он не может его найти, единство рушится.Ценность готового никогда не меняется.Неважно, что игра блокируется, потому что это должно быть закончено до начала игры.

Мой вопрос: как я могу решить эту проблему, когда я жду результата этой сопрограммы.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я действительно нашел способ, который был намного проще и понятнее

public bool TryConnect()
{
    WebRequest request = WebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    return response.StatusCode == HttpStatusCode.OK;
}

Так как он не запускается на сопрограмме, код просто ждет, пока ответ не будет получен.Это также намного быстрее, чем версия Unities.Поскольку все это вызывается в основном потоке, игра ждет ответа, прежде чем даже запустится.Тайм-аут на это самое большее секунда, поэтому он не задерживает игру (как тайм-аут соединения из Unity делает)

0 голосов
/ 20 декабря 2018

Вы блокируете свой основной поток, когда используете while(!finished){}.Лучше вы должны переместить свою сопрограмму в другой сценарий.т.е. где ваши обработчики доступны.И вызовите каждого обработчика в сопрограмме.Если соединение недоступно, перейдите к следующему обработчику в следующем экземпляре сопрограммы.

Вы можете проверить измененную функцию.Функция представляет собой грубый фрагмент кода, основанный на вашем коде, который продолжает проверять соединение до тех пор, пока он либо не подключится к какому-либо из обработчиков, либо не исчерпает обработчики.

public IEnumerator TryConnection(int index)
{
    if (handlers.count > index)
    {
        //Get next handler here
        Handler handler = handlers[index];
        UnityWebRequest www = UnityWebRequest.Get(handler.url);
        www.timeout = 5;
        yield return www.SendWebRequest();
        if (www.isNetworkError)
        {
            StartCoroutine(TryConnection(index++));
        }
        else
        {
            handler.init();
        }
    }        
}

Не забудьте переместить TryConnection туда, гдеу вас есть список доступных обработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...