Запуск задач внутри другой задачи дублирует мои веб-запросы - PullRequest
0 голосов
/ 22 ноября 2018

Я использую приведенный ниже код, чтобы проверить некоторые PDF-файлы в Интернете и вернуть соответствующую строку.

Проблема заключается в следующем: когда я добавил второй Task.Factory.StartNew(), он начал дублировать все запросы, но по-прежнему возвращал только один ответ(так, как это должно быть).

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

public static void Main(string[] args)
        {

            var listT = new List<string>()
            {
                "24006025062"
            };

            var task = listT.Select(x => Task.Factory.StartNew(() => TesteTask(x)));

            Task.WaitAll(task.ToArray(), TimeSpan.FromSeconds(120));

            List<string> results = new List<string>();
            foreach (var result in task)
            {
                results.Add(result.Result);
            }
        }

private static string TesteTask(string codCart)
    {
        var teste = new Consulta();
        var retorno = string.Empty;

        var session = teste.GetCaptcha();


        for (int i = 0; i < 10; i++)
        {
            session.CaptchaResolvida = QuebraCaptcha(session.CaptchaCodificada).CaptchaResolvida;
            if (session.CaptchaResolvida.Length > 0)
            {
                var links = teste.Consulta(codCart, session).Retorno;

                if (links.Any())
                {
                    var tasks = links.Select(x => Task.Factory.StartNew(() => Executa(teste, session, x)));

                    Task.WaitAll(tasks.ToArray(), TimeSpan.FromSeconds(120));

                    var modelList = from Result in tasks select Result.Result;

                    retorno = teste.FinalizaProcesso(modelList.ToList());

                    break;
                }
            }


        }

        return retorno;
    }

private static string Executa(Consulta teste, Model<Request> session, string link)
    {
        var retorno = string.Empty;

        for (int i = 0; i < 10; i++)
        {
            var CaptchaResolvida = QuebraCaptcha(teste.GetCaptchaPdf(session)).CaptchaResolvida;

            if (CaptchaResolvida != null && CaptchaResolvida != string.Empty)
            {
                var status = teste.BaixaPdf(link, CaptchaResolvida, session);

                if (status != string.Empty)
                {
                    retorno = status;
                    break;
                }
            }
        }

        return retorno;
    }

Ps: Это мой первый пост о переполнении стека, еслиЯ не достаточно ясно, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 22 ноября 2018

Вы получаете такое поведение, потому что дважды выполняете итерацию для Select возвращаемого IEnumerable .Попробуйте это:

public static void Main(string[] args)
    {

        var listT = new List<string>()
        {
            "24006025062"
        };

        var task = list
            .Select(x => Task.Factory.StartNew(() => TesteTask(x)))
            .ToArray();

        Task.WaitAll(task, TimeSpan.FromSeconds(120));

        List<string> results = new List<string>();
        foreach (var result in task)
        {
            results.Add(result.Result);
        }
    }

Перемещая ToArray() сразу после Select(), он создает результаты IEnumerable только один раз вместо двух.

Надеюсь, это поможет!

...