C# .NET线程-HttpWebRequest开始响应+;自动还原剂

C# .NET线程-HttpWebRequest开始响应+;自动还原剂,c#,multithreading,C#,Multithreading,我想知道这两种方法中哪一种是更好的实施方法? 我需要创建一个web请求,其范围在200毫秒到5秒之间。我需要html响应才能继续-因此需要在主线程上阻塞 第一种方法 string GetResponse() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); IAsyncResult result = request.BeginGetResponse(null, null); u

我想知道这两种方法中哪一种是更好的实施方法? 我需要创建一个web请求,其范围在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();
            }
        }
第二种方法

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

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

为什么要使用async Begin…方法而不是sync调用?或者这是Silverlight?基本上我的问题应该是,在我的案例中,上述方法是否有任何优势?任务是否会分配给IO线程并减少总执行时间?基本上,我的问题应该是,在我的情况下,上述方法是否有任何优势?是否将任务分配给IO线程并减少总执行时间?否,这将花费更长的时间,因为您有管理其他线程的开销。虽然不会太久,但这真的不会更快。