【问题标题】:.NET Threading - HttpWebRequest BeginGetResponse + AutoResetEvent.NET 线程 - HttpWebRequest BeginGetResponse + AutoResetEvent
【发布时间】:2010-10-28 06:57:09
【问题描述】:

我想知道这两种方法中哪种方法更好? 我需要创建一个范围在 200 毫秒到 5 秒之间的网络请求。我需要 html 响应才能继续 - 所以需要阻塞主线程。

第一种方法

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();
            }
        }

【问题讨论】:

  • 你为什么还要使用 async Begin... 方法而不是 sync 调用?还是这是 Silverlight?
  • 基本上我的问题应该是在我的情况下上述方法有什么优势吗?任务是否会分配给 IO 线程并减少总执行时间?

标签: c# multithreading


【解决方案1】:

为什么不在主线程上执行 web 请求呢?如果您希望主线程阻塞,这是迄今为止最简单的方法。

【讨论】:

  • 基本上我的问题应该是在我的情况下上述方法有什么优势吗?任务是否会分配给 IO 线程并减少总执行时间?
  • 不,这将花费更长的时间,因为您有管理其他线程的开销。虽然不会更长,但这确实不会更快。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多