Asyn c Задача не вернется в мой класс вызова запуска задачи - PullRequest
0 голосов
/ 03 августа 2020

У меня есть следующие классы:

public struct _2CaptchaResult
{
    public bool Success;
    public string Response;

    public _2CaptchaResult(bool success, string response)
    {
        Success = success;
        Response = response;
    }
}

private async Task<_2CaptchaResult> SolveCaptchaAsync(string imagename)
{
    var result = await captcha.Solve...
    return new _2CaptchaResult
    {
        Success = result.Success,
        Response = result.Response,
    };
}

public async void login(string method)
{
    var result = await Task.Run(() => SolveCaptchaAsync(imagename));
    dostuff with the result...
}

Когда я запускаю свой Task, все работает нормально в классе SolveCaptcha. Похоже, что после того, как SolveCaptcha Task будет выполнено, он не go вернется к классу входа с результатом, он просто закончится ...

Он все еще не может узнать, почему он останавливается после завершения Задачи. (await Task.Run(() => SolveCaptcha(imagename));)

Мне нужно дождаться результатов решения Captcha, прежде чем я смогу продолжить свой класс входа. Класс SolveCaptcha работает нормально, я получаю свои результаты по вызову captcha.solve. Но он не передает результаты моему классу входа, кажется, что он просто останавливается после.

Спасибо за любую помощь, я новичок в C#.

1 Ответ

0 голосов
/ 03 августа 2020

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

var result = await Task.Run(() => SolveCaptcha(imagename)).ConfigureAwait(false);

вместо того, что вы сейчас делаете в методе login.

Еще я заметил, что SolveCaptcha() уже asynchronus, поэтому вам не нужна оболочка Task.Run(). Обычно вы используете оболочку Task.Run() для работы, связанной с процессором (подумайте о тяжелой обработке, такой как хеширование, шифрование и т. Д. c.), А не для работы ввода-вывода (например, чтение из сокета или файла).

Так что в в конце он должен выглядеть так:

await SolveCaptcha(imagename).ConfigureAwait(false);

Еще одна проблема, которую следует исправить, - это ваш метод, содержащий эту строку. У вас это async void, но должно быть async Task. Вызывающему абоненту понадобится Task для ожидания и проверки.

Что касается того, как происходит эта тупиковая блокировка ... информации об этом достаточно. Просто погуглите c# async/await configureawait deadlock. Вот дополнительная информация для начала (где-нибудь в середине страницы найдите слово "deadlock" жирным шрифтом)

...