асинхронное ожидание потери ответа в c # - PullRequest
1 голос
/ 09 мая 2019

Следующий код работает нормально: его пример кода загружен с GitHub и установлен с моим изображением и ключами API.

 static void Main(string[] args)
    {
        Foo().GetAwaiter().GetResult();
        Console.ReadKey();
    }

    static async Task Foo()
    {
        var antiCaptcha = new AntiCaptcha("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        // Get current balance
        var balance = await antiCaptcha.GetBalance();

        string base64captcha = "Here is a base64 string of a captcha";

        // Solve image captcha
        var image = antiCaptcha.SolveImage(base64captcha);
        image.Wait();

        var res = image.Result;
}

Мое приложение отличается: Там я тоже реализовал.

 public async Task<AntiCaptchaResult> AntiCaptchaSolution(string ApplicationId, string captchaBase64, string Success)
    {
        var antiCaptcha = new AntiCaptcha("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        // Solve image captcha
        var image = antiCaptcha.SolveImage(captchaBase64);
        image.Wait();

        return image.Result;
    }

Когда я не отлаживаю, он ничего не отвечает.

И когда я отлаживаю, отладчик исчезает после строки anticaptcha.SolveImage и никогда не приходит, и после этого ничего не происходит.

** Я вызываю этот метод из другого метода: **

 public string GetFirstCaptcha(string Success="False")
    {
captchasrc = "";
var res = AntiCaptchaSolution(applicationid, captchasrc, Success).GetAwaiter().GetResult();
    }

1 Ответ

3 голосов
/ 09 мая 2019

Я предлагаю вам использовать await везде, где вы делаете .Wait() сейчас. Нетрудно понять сложность async / await и то, как он работает, но ясно одно: лучше не объединять async с блокировкой .Wait(). Это может привести к тупику.

В Интернете есть много объяснений, например, здесь .

В качестве альтернативы, если у вас нет async/await во всем вашем стеке, вы можете просто удалить async из вашего AntiCaptchaSolution метода и сделать обычный вызов блокировки с помощью .Result / .Wait(), но затем конечно не будет асинхронным.

...