线程池与任务与异步

ThreadPool Vs Task Vs Async

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

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

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

PS。如果您想复制代码并 运行 它,请确保您 select 项目设置中的启动对象。您可以select启动Main方法之一。

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);
        }
    }
}

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

您正在使用控制台程序并且不关心发送电子邮件returns。那不是正常情况。

async/await 在线程池之上使用 Task 而 运行。所以你的 'vs' 站不住脚。通常你至少会关心发生的错误。

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

然而,在大多数情况下,您的目标是可等待的任务。 SmtpClient.SendAsync() 不可等待,因此 运行 同步 Send() 的任务似乎最合适。

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