2010-10-28 2 views
3

Я хотел бы знать, какой подход среди двух является лучшей реализацией? Мне нужно создать веб-запрос, который может находиться в диапазоне от 200 мс до 5 секунд. Мне нужно, чтобы html-ответ продолжался - так что нужно блокировать основной поток..NET Threading - HttpWebRequest BeginGetResponse + AutoResetEvent

Первый подход

string GetResponse() 
{ 

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    IAsyncResult result = request.BeginGetResponse(null, null);  

using (HttpWebResponse httpResponse = (HttpWebResponse)request.EndGetResponse(result)) 
{ 
    using (Stream dataStream = httpResponse.GetResponseStream()) 
    { 
     StreamReader reader = new StreamReader(dataStream); 
     response = reader.ReadToEnd(); 
    } 
} 

Второй подход

string response = string.Empty; 
AutoResetEvent waitHandle = null; 
void GetResponse(string url) 
{ 
    waitHandle = new AutoResetEvent(false); 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     IAsyncResult asyncResult = request.BeginGetResponse(Callback, request); 

     waitHandle.WaitOne(); 
    } 
    catch { } 
    finally 
    { 
     waitHandle.Close(); 
    } 
} 

    void Callback(IAsyncResult asyncResult)  
    {   

HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 
      try 
      { 
       using (HttpWebResponse httpResponse = (HttpWebResponse)request.EndGetResponse(asyncResult)) 
       { 
        if (httpResponse.StatusCode == HttpStatusCode.OK) 
        { 
         using (Stream dataStream = httpResponse.GetResponseStream()) 
         { 
          StreamReader reader = new StreamReader(dataStream); 
          response = reader.ReadToEnd(); 
         } 
        } 
       } 
      } 
      catch { } 
      finally 
      { 
       waitHandle.Set(); 
      } 
     } 
+0

Почему вы даже используете метод async Begin ... вместо вызова синхронизации? Или это Silverlight? –

+0

В основном, мой вопрос должен был иметь преимущество в приведенных выше подходах в моем случае? Будет ли назначена задача для потока ввода-вывода и сокращено общее время выполнения? – user489686

ответ

2

Почему бы не выполнить веб-запрос на основной поток? Если вы хотите, чтобы основной поток блокировался, это, безусловно, самый простой способ выполнить это.

+0

В основном, мой вопрос должен был заключаться в преимуществах вышеупомянутых подходов в моем случае? Будет ли назначена задача для потока ввода-вывода и сокращено общее время выполнения? – user489686

+1

Нет, это займет больше времени, потому что у вас есть накладные расходы на управление другим потоком. Не намного больше, хотя, но это действительно не будет быстрее. –

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