【发布时间】:2016-05-26 11:25:06
【问题描述】:
我只是想了解如何在 c# 中进行并行处理。这是我的代码示例:
Parallel.For(0, 1000, index =>
{
try
{
var url = "some exemplary url";
HttpStatusCode statusCode;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
StringBuilder data = new StringBuilder();
using (HttpWebResponse myWebResponse = (HttpWebResponse)request.GetResponse())
{
statusCode = myWebResponse.StatusCode;
if (myWebResponse.GetResponseStream() != null)
{
StreamReader streamReader = new StreamReader(myWebResponse.GetResponseStream());
using (streamReader)
{
string line = string.Empty;
while ((line = streamReader.ReadLine()) != null)
{
data.Append(line);
}
}
}
MailMessage msg = new MailMessage();
msg.Subject = "subject";
msg.From = new MailAddress("no-reply@domain.co.uk");
msg.To.Add("name.name@domain.com");
msg.Body = data.ToString();
msg.IsBodyHtml = true;
var newSmtp = new SmtpClient();
newSmtp.Send(msg);
Interlocked.Increment(ref count);
}
}
catch (Exception e)
{
}
});
代码的技术在这里并不重要,因为它运行良好。但是,对“一些示例性 URL”的请求相当耗时,并且在处理 +-30 个请求后,我收到“操作已超时”异常。当我更改 Parallel for 循环并像这样添加 MaxDegreeOfParallelism 选项时
Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 4 }, index =>
{
我不再抛出异常。所以,我想弄清楚为什么添加这个选项会修复工作流程?在我看来,这与线程管理有关吗?我的理解是,当我不指定线程数时,会在等待前一个线程完成之前创建新线程?我是对的,还是我的代码有问题?
【问题讨论】:
标签: c# multithreading parallel-processing task-parallel-library