WebRequest.BeginGetResponse - 非void方法的“AsyncCallback”目标

时间:2011-02-21 12:40:33

标签: c# asynchronous httpwebrequest

您好我需要异步调用HttpWebRequest,问题是BeginGetResponse方法具有作为第一个参数的AsyncCallback具有void签名的目标方法。

    WebRequest _webRequest;

    private void StartWebRequest()
    {
        _webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
    }

我需要具有Stream返回类型的目标方法。像这样:

    private Stream FinishWebRequest(IAsyncResult result)
    {
       var response= _webRequest.EndGetResponse(result);

       using (var stream = response.GetResponseStream())
       {
           Byte[] buffer = new Byte[response.ContentLength];
           int offset = 0, actuallyRead = 0;
           do
           {
               actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
               offset += actuallyRead;
           }
           while (actuallyRead > 0);
           return new MemoryStream(buffer);
       }
    }

我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

基本上,你不能。这不可能是你的回调。而且, 你的回调是没有意义的,因为实际上没有任何东西可以使用返回的流。一旦回调被触发,您打算在流中发生什么?

创建一个只调用FinishWebRequest方法的回调很容易,但这样会丢弃该流,不会让你感觉更好......

(就个人而言,我不会依赖ContentLength - 它并不总是设置。我只是维护一个你读入的小缓冲区,然后直接写入内存流。如果你使用的是.NET 4您可以使用新的Stream.CopyTo方法来简化生活。另外,WebResponse实现了IDisposable,因此您也应该有using语句。)