WebRequest.BeginGetResponse - цель «AsyncCallback» для не пустого метода - PullRequest
0 голосов
/ 21 февраля 2011

Привет, мне нужно вызвать 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 Ответ

1 голос
/ 21 февраля 2011

Вы не можете, в основном.Это не может быть вашим обратным вызовом.Более того, было бы бессмысленно быть вашим обратным вызовом, потому что на самом деле ничто не может использовать возвращаемый поток.Что вы собираетесь делать с потоком после запуска обратного вызова?

Достаточно просто создать обратный вызов, который просто вызывает ваш метод FinishWebRequest, но это отбросит поток, не оставляя вас в лучшем положении...

(Лично я, кстати, не стал бы полагаться на ContentLength - он не всегда установлен. Я бы просто поддерживал небольшой буфер, в который вы читали, а затем записывал прямо в поток памяти. Если вы 'Используя .NET 4, вы можете использовать новый метод Stream.CopyTo, чтобы упростить жизнь. Кроме того, WebResponse реализует IDisposable, так что для этого у вас должен быть оператор using.)

...