线程池与任务与异步
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() 的任务似乎最合适。
当真正涉及发送(批量)邮件时,您还需要解决一些其他问题,例如限制并行调用的数量。
我有以下显示发送电子邮件的代码。我可以通过 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() 的任务似乎最合适。
当真正涉及发送(批量)邮件时,您还需要解决一些其他问题,例如限制并行调用的数量。