首页 > 解决方案 > Task.Run 不执行所有的 httpwebrequest 方法

问题描述

我有一个发送大量 httpwebrequests 并读取数据的应用程序。所以我决定在不同的任务上运行每个请求。我最终有大约 60 个任务要运行。问题是当我使用task.run时这些请求没有得到执行。事实上,一些请求被发送到服务器并用数据返回响应,其中很多只是被忽略了。我想知道这是否是因为 CPU 限制,如果是这样,如何处理此类请求。

请求数据的方法示例:

private static bool getResponseData(string url, string pageNumber)
        {
            url = url + "page=" + pageNumber;
            Uri myUri = new Uri(url, UriKind.Absolute);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
            request.AutomaticDecompression = DecompressionMethods.GZip;
            try
            {   
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        Stream receiveStream = response.GetResponseStream();
                        StreamReader readStream = null;

                        if (String.IsNullOrWhiteSpace(response.CharacterSet))
                            readStream = new StreamReader(receiveStream);
                        else
                            readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
                        string data = readStream.ReadToEnd();
                          //dealing with data by storing it in the data base
                        return true;
                    }
                    return false;
                }
            }   
        }

一种循环遍历 url 页面的方法

    private void startrequest(string url)
    {
        bool data2 = getResponseData(url, "0");
        int counter2 = 0;
        while (data2 && counter2 < 4)
        {
            counter2++;
            data2 = getResponseData(url, counter2.ToString());
        }
    }

在我的应用中使用task.run的例子如下:

            Task task1 = Task.Run(() => startrequest("www.x1.com"));
            Task task2 = Task.Run(() => startrequest("www.x2.com"));
            Task task3 = Task.Run(() => startrequest("www.x3.com"));
            Task task4 = Task.Run(() => startrequest("www.x4.com"));
            Task.WaitAll(task1, task2, task3, task4);

如果我在不使用 Task.Run 的情况下手动运行 startrequest 方法,我总是会得到正确的数据。我在 I5 上运行我的电脑。

标签: c#asp.net-mvc

解决方案


推荐阅读