2009-10-17 3 views
0

msdn дает нам этот пример для получения данных сообщения.Получается ли получение данных из HttpListenerRequest асинхронно?

public static void ShowRequestData (HttpListenerRequest request) 
{ 
    if (!request.HasEntityBody) 
    { 
     Console.WriteLine("No client data was sent with the request."); 
     return; 
    } 
    System.IO.Stream body = request.InputStream; 
    System.Text.Encoding encoding = request.ContentEncoding; 
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); 
    if (request.ContentType != null) 
    { 
     Console.WriteLine("Client data content type {0}", request.ContentType); 
    } 
    Console.WriteLine("Client data content length {0}", request.ContentLength64); 

    Console.WriteLine("Start of client data:"); 
    // Convert the data to a string and display it on the console. 
    string s = reader.ReadToEnd(); 
    Console.WriteLine(s); 
    Console.WriteLine("End of client data:"); 
    body.Close(); 
    reader.Close(); 
    // If you are finished with the request, it should be closed also. 
} 

source

Я проверил класс StreamReader и там нет Begin ... End ... методы. Означает ли это, что данные Post не могут быть получены асинхронно? Или он уже был извлечен до того, как появился обратный вызов из HttpListener?

Я бы не хотел, чтобы получить потокобезопасности стойла, а кусок медленных почтовых данных приходит.

Что такое правильный асинхронный способ сделать это? (Или это ReadToEnd на самом деле правильно?)

благодаря

R

ответ

0

Вместо использования StreamReader вы могли бы назвать Stream.BeginRead на вашем входящем потоке.


UPDATE: Вот пример использования BeginRead на поток:

class State 
{ 
    public Stream Stream { get; set; } 
    public byte[] Buffer { get; set; } 
} 

class Program 
{ 
    private const int ChunkSize = 1024; 
    static void Main(string[] args) 
    { 
     var stream = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     var state = new State { Stream = stream, Buffer = new byte[ChunkSize] }; 
     var ar = stream.BeginRead(state.Buffer, 0, state.Buffer.Length, Callback, state); 
     while (!ar.IsCompleted) 
     { 
      Thread.Sleep(10); 
     } 
    } 

    static void Callback(IAsyncResult ar) 
    { 
     var state = (State)ar.AsyncState; 
     var bytesRead = state.Stream.EndRead(ar); 
     if (bytesRead > 0) 
     { 
      byte[] buffer = new byte[bytesRead]; 
      Buffer.BlockCopy(state.Buffer, 0, buffer, 0, bytesRead); 
      // Do something with the received buffer. 
      Console.Write(Encoding.UTF8.GetString(buffer)); 

      state.Stream.BeginRead(state.Buffer, 0, state.Buffer.Length, Callback, state); 
     } 
     else 
     { 
      // reached the end of the stream 
      state.Stream.Dispose(); 
     } 
    } 
} 
+0

здорово! благодаря...! – Toad

Смежные вопросы