消耗异步HttpWebResponse响应流的最有效方法

时间:2014-04-22 20:24:35

标签: c# .net asynchronous httpwebrequest

我正在C#.Net 4.5中使用HttpWebRequest.BeginGetResponseHttpWebRequest.EndGetResponse制作一个刮刀。在响应回调中,我打开流并将数据作为字符串获取,这样我就可以对它运行一些RegEx并收集匹配的结果。

目前,我正在使用以下代码来使用响应流。但是,我发现在StreamReader.ReadBlock函数和字符串构造函数上经常会出现CPU峰值,该构造函数用于将char数组转换为字符串。

private void ResponseCallback(IAsyncResult result)
{
    if (!result.IsCompleted)
        return;
    HttpWebRequest request = result.AsyncState;
    try
    {
        using (var response = (HttpWebResponse) request.EndGetResponse(result))
        {
            if (response.StatusCode == HttpStatusCode.OK)
            {
                var buffer = new char[1000];
                using (Stream stream = response.GetResponseStream())
                {
                    if (stream != null)
                    {
                        using (var sr = new StreamReader(stream))
                        {
                            while (sr.ReadBlock(buffer, 0, buffer.Length) > 0)
                            {
                                Match regexMatch = Globals.UserRegex.Match(new string(buffer));
                                if (regexMatch.Success)
                                {
                                    Globals.AddCollectedData(regexMatch.Groups[1].Value);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    finally
    {
        Interlocked.Decrement(ref asyncRequestsActive);
    }
}

我发现StreamReader.ReadToEndStreamReader.Read产生了较差的结果后,我以这种方式编写了我的应用程序。但是,我仍然对表现不满意。我有什么办法可以改进这段代码吗?

0 个答案:

没有答案