c# - 在另一个任务中启动任务正在复制我的WebRequests

原文 标签 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;
    }

附:这是我关于堆栈溢出的第一篇文章,如果我不够清楚,请告诉我!

最佳答案

之所以会出现这种现象,是因为您对返回的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# - 在另一个任务中启动任务正在复制我的WebRequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53436599/

相关文章:

c# - 如何安全地取消任务?

c# - ASP.NET MVC 4,为什么自定义引擎找不到 View

c# - 如何重定向到保管箱并使用访问 token 返回我的应用程序(如何使用保管箱登录)

c++ - 无锁容器如何对并发分区和排序作出 react ?

memory - 我如何将一个拥有的盒子发送给子任务?

asp.net-mvc - 是否等待 Task.Delay;真的让 Web 服务器能够处理更多的并发请求吗?

c# - 面向无主键约束的表的Dapper或ADO.NET

c# - 在 LINQPad 中使用 Dump() 扩展方法和使用 Console.WriteLine() 有什么区别?

java - Java RMI和高级多线程

java - 如何从非 Activity 线程调用 Activity ?