我正在C#.Net 4.5中使用HttpWebRequest.BeginGetResponse
和HttpWebRequest.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.ReadToEnd
和StreamReader.Read
产生了较差的结果后,我以这种方式编写了我的应用程序。但是,我仍然对表现不满意。我有什么办法可以改进这段代码吗?