c# - 在另一个任务中启动任务会重复我的 WebRequest

标签 c# multithreading task factory multitasking

我使用下面的代码在线检查一些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:这是我第一篇关于堆栈溢出的文章,如果我不够清楚,请告诉我!

最佳答案

您之所以会出现此行为,是因为您在 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,而不是两次。

希望对你有帮助!

关于c# - 在另一个任务中启动任务会重复我的 WebRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53436599/

相关文章:

c# - 获取winforms文本框的光标位置

node.js - Nodejs - 可以在线程池大小为 4 的同时运行的最大线程是多少?

c# - 从 Azman 获取属于角色的任务列表

c# - 调用 Task.Delay() 并在几分钟后询问还剩多少时间

java - 单次后台线程,避免连接?

python - 我可以使用 python os.nice 来降低 celery 任务的友好度吗?

c# - 如何将 'state' 查询参数添加到 OAuth 请求(或忽略它)

c# - 将一个窗口放在另一个窗口前面

c# - 替换单词,但仅在特定行上

.net - Windows 窗体计时器与单线程应用程序