Task.Factory.StartNew并行运行任务

时间:2014-03-04 14:47:08

标签: c# multithreading task

我是新的在C#中使用线程,甚至我一直在阅读漏洞,我无法解决这个问题:

我有一个使用框架4.5发送电子邮件的控制台应用程序,问题是即使我正在使用Task.Factory.StartNew它似乎应用程序按顺序运行线程而不是并行运行。

任何人都可以给我一些建议吗?

注意: queuedEmails包含MAX数量为70的电子邮件列表

CODE:

public void Send()
{
    IList<Task> tasks = new List<Task>();
    List<string> logLines = new List<string>();

    foreach (EmailEnt emailEnt in queuedEmails)
    {
        string subject = "I'm the subject";
        string cuerpo_email = "I'm the email body";

        tasks.Add(Task.Factory.StartNew(() =>
        {
                DownloadHtml("http://www.google.com");
                Console.Out.WriteLine("done"+DateTime.Now.TimeOfDay);
        }));
    }
    Task.WaitAll(tasks.ToArray());
}

  public static string DownloadHtml(string Url)
    {
        // Open a connection
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create(Url);

        // You can also specify additional header values like 
        // the user agent or the referer:

        WebRequestObject.UserAgent = ".NET Framework/2.0";
        WebRequestObject.Referer = "http://www.example.com/";

        // Request response:
        WebResponse Response = WebRequestObject.GetResponse();

        // Open data stream:
        System.IO.Stream WebStream = Response.GetResponseStream();

        // Create reader object:
        System.IO.StreamReader Reader = new System.IO.StreamReader(WebStream);

        // Read the entire stream content:
        string PageContent = Reader.ReadToEnd();

        // Cleanup
        Reader.Close();
        WebStream.Close();
        Response.Close();

        return PageContent;
    }

3 个答案:

答案 0 :(得分:3)

De SendMailMessage方法不能被异步调用。因此,准备您的邮件将是并行完成的,但由于发送是按顺序完成的,因此您的电子邮件将逐个发送。

http://msdn.microsoft.com/en-us/library/swas0fwc%28v=vs.110%29.aspx

答案 1 :(得分:1)

如果您的SendMailMessage方法使用SmtpClient.Send方法,请在MSDN文档(http://msdn.microsoft.com/en-us/library/swas0fwc(v=vs.110).aspx)中说明:

  

此方法会在传输电子邮件时阻止。

还有:

  

如果异步发送消息,则无法调用此方法。

因此,如果您想并行发送,似乎必须使用其他方法...但是,同步发送应该会造成任何问题,因为良好的SMTP服务器可以快速处理外发消息(并且通常只是将它们排队)。

答案 2 :(得分:-1)

您的电子邮件提供商或您与电子邮件提供商的网络连接可能无法支持大量并发连接。只允许一些并发请求,甚至只有一个并发请求,这并不是异常。

如果你做的不是发送电子邮件,你可能会看到一些并行化,但在这种情况下,你的请求正在进一步同步。