我有以下代码,显示发送电子邮件。我可以通过 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);
}
}
}
答案 0 :(得分:3)
这似乎是一个合理的问题,但背景很难给出一个好的答案。
您正在使用控制台程序而不关心SendEmail返回的内容。这不是正常情况。
async
/ await
使用在ThreadPool上运行的Task
。所以你的'vs'不会支撑。通常你至少会关心发生的错误。
如果您真的不关心错误或结果,QueueUserWorkItem()
是最基本的方法。
在大多数情况下,你会瞄准一个等待的任务。 SmtpClient.SendAsync()是不可行的,因此运行同步Send()的Task似乎是最合适的。
当真正关于发送(批量)邮件时,您还需要解决其他一些问题,例如限制并行调用的数量。