ThreadPool对任务与异步

时间:2015-06-28 11:56:18

标签: async-await task-parallel-library task threadpool

我有以下代码,显示发送电子邮件。我可以通过 ThreadPool,Task和Async 实现这一目标。调用者(在本例中为Main)对返回的内容不感兴趣。

据我所知,这三种方法都会创建一个额外的线程,因此最终结果是相同的。

如果您发现任何其他差异,或者哪些应该是.NET 4.5中的正确方法,请分享?

PS。如果要复制代码并运行它,请确保在项目设置中选择启动对象。您可以选择其中一个启动主要方法。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncTest
{
    class ThreadPoolProgram
    {
        static void Main(string[] args)
        {
            // Dont care what SendEmail returns
            ThreadPool.QueueUserWorkItem(new WaitCallback(SendEmail));
        }

        static void SendEmail(Object stateInfo)
        {
            // Create a SMTP client, send an email and wait for the SMTP client to return!

            // Takes 2 seconds
        }
    }

    class TaskProgram
    {
        static void Main(string[] args)
        {
            // Dont care what SendEmail returns
            Task.Run(() => SendEmail());
        }

        static void SendEmail()
        {
            // Create a SMTP client, send an email and wait for the SMTP client to return!

            // Takes 2 seconds
        }
    }

    class AsyncProgram
    {
        static void Main(string[] args)
        {
            // Don't await for an answer from the SendMail
            // var r = await SendEmail();

            SendEmail(); // Call without await
        }

        static Task<bool> SendEmail()
        {
            // Create a SMTP client, send an email and wait for the SMTP client to return!

            // Takes 2 seconds

            return Task.FromResult(true);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这似乎是一个合理的问题,但背景很难给出一个好的答案。

您正在使用控制台程序而不关心SendEmail返回的内容。这不是正常情况。

async / await使用在ThreadPool上运行的Task。所以你的'vs'不会支撑。通常你至少会关心发生的错误。

如果您真的不关心错误或结果,QueueUserWorkItem()是最基本的方法。

在大多数情况下,你会瞄准一个等待的任务。 SmtpClient.SendAsync()是不可行的,因此运行同步Send()的Task似乎是最合适的。

当真正关于发送(批量)邮件时,您还需要解决其他一些问题,例如限制并行调用的数量。