2010-10-28 36 views
3

我想知道哪两种方法是更好的实现? 我需要创建一个范围在200ms到5秒之间的Web请求。我需要html响应继续 - 所以需要在主线程上阻塞。.NET线程 - 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

为什么你甚至使用异步Begin ...方法而不是同步调用?或者这是Silverlight? – 2010-10-28 07:13:29

+0

基本上我的问题应该是在我的情况下,上述方法有没有优势?将任务分配给IO线程并减少总执行时间吗? – user489686 2010-10-28 12:23:31

回答

2

为什么不执行主线程上的Web请求?如果你想让主线程阻塞,这是迄今为止最简单的方法。

+0

基本上我的问题应该是在我的情况下,上述方法有什么优势?将任务分配给IO线程并减少总执行时间吗? – user489686 2010-10-28 12:20:45

+1

不,这会花费更长时间,因为您有管理其他线程的开销。虽然时间不长,但这真的不会更快。 – 2010-10-28 12:25:37