Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest-为多个请求异步检索数据_C#_Asynchronous_Httpwebrequest_Webrequest - Fatal编程技术网

C# WebRequest-为多个请求异步检索数据

C# WebRequest-为多个请求异步检索数据,c#,asynchronous,httpwebrequest,webrequest,C#,Asynchronous,Httpwebrequest,Webrequest,代码不完整(未生成),因为我无法在writeResponseTA()中获取下一行中的“项” 我一定错过了什么。请指出 以下是完整的代码:- static string[] imageUris = { "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg", "http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",

代码不完整(未生成),因为我无法在writeResponseTA()中获取下一行中的“项”

我一定错过了什么。请指出

以下是完整的代码:-

static string[] imageUris =
        { "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/117500/117598.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106400/106412.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106400/106411.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106200/106275.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106300/106362.2.jpg"
        };

        static void Main(string[] args)
        {
            SendAsynchronousRequests();
            Console.WriteLine("All the files have been requested and retrieved...");
            Console.ReadLine();
        }



static void SendAsynchronousRequests()
        {
            WebRequest[] requests = InitializeWebRequests();
            foreach (var item in requests)
            {
                Console.WriteLine("Trying to retrieve :-" + item.RequestUri.OriginalString);
                item.BeginGetResponse
                (
                   WriteResponseData,
                );
             }

        }

    static WebRequest[] InitializeWebRequests()
    {
        WebRequest[] requests = new WebRequest[imageUris.Length];
        int temp = 0;
        foreach (var item in imageUris)
        {
            requests[temp] = WebRequest.Create(item);
            //requests[temp].Method = "GET";
            temp++;
        }
        return requests;
    }
    static void WriteResponseData(IAsyncResult result)
    {
        HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);
        Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
        Console.WriteLine("WebResp.Server :- " + WebResp.Server);
        Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
        Console.WriteLine(Environment.NewLine);

    }
编辑

因此,该方法(将编译)的修改代码如下:-

WebRequest request = (WebRequest)result.AsyncState;
            if (result != null && result.IsCompleted)
            {
                HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
                Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
                Console.WriteLine("WebResp.Server :- " + WebResp.Server);
                Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
                Console.WriteLine(Environment.NewLine);
            }
item.BeginGetResponse
                    (
                       WriteResponseData, null
                    );
它给出了以下运行时错误:-

对象引用未设置为 对象的实例。在 WebRequestUsingAppm.Program.WriterResponseTA(IAsyncResult 结果)在 \webrequestusingaam\Program.cs:第73行 在 System.Net.LazyAsyncResult.Complete(IntPtr 用户令牌)在 System.Net.ContextawarerResult.CompleteCallback(对象 国家)在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 ignoreSyncCtx)在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态)在 System.Net.ContextAwareResult.Complete(IntPtr 用户令牌)在 System.Net.LazyAsyncResult.ProtectedInvokeCallback(对象 结果,IntPtr userToken)位于 System.Net.HttpWebRequest.ProcessResponse()

编辑:-
我明白了。result.AsyncState返回null,因为我在调用BeginGetResponse()时传递null,第二个参数是AsyncState,我在那里传递null。我应该在那里传递当前的WebRequest对象,这样就可以了

因此,与其说:-

WebRequest request = (WebRequest)result.AsyncState;
            if (result != null && result.IsCompleted)
            {
                HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
                Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
                Console.WriteLine("WebResp.Server :- " + WebResp.Server);
                Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
                Console.WriteLine(Environment.NewLine);
            }
item.BeginGetResponse
                    (
                       WriteResponseData, null
                    );
我应该通过这个项目:-

item.BeginGetResponse
                        (
                           WriteResponseData, item
                        );

正如您所说,这段代码不会编译,因为WriteResponse方法不会引用item对象。调用begin request时,可以使用传递请求对象作为状态。请参阅MSDN

编辑:简化的代码模板将是

   item.BeginGetResponse(WriteResponseData, item);
并将writeResponda修改为

static void WriteResponseData(IAsyncResult result)
{
    WebRequest request = (WebRequest)result.AsyncState;
    WebResponse response = request.EndGetResponse(result);
    ....
}

我明白了。result.AsyncState返回null,因为我在调用BeginGetResponse()时传递null,第二个参数是AsyncState,我在那里传递null。我应该在那里传递当前的WebRequest对象,这样就可以了。谢谢