long-运行 操作的任务或线程?
Tasks or Threads for a long-running operation?
我有一个 windows 服务,运行 有两种方法;一种使用 Ae.Net.Mail
库每 5 分钟从三个电子邮件帐户读取未读电子邮件(我们称之为 EmailParserWorker),另一种方法每 30 分钟进行一次未指定的作业。因为这些方法必须 运行 每 X 时间,我使用 Timer
来管理它们,它们工作正常。
private Timer mailParserTimer;
private readonly TimeSpan SLEEP_TIME_MAIL_PARSER = TimeSpan.FromSeconds(300d);
/*...*/
public MyService()
{
ServiceName = _serviceName;
mailParserTimer = new Timer(new TimerCallback(EmailParserWorker), null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
}
public void StartService()
{
mailParserTimer.Change(SLEEP_TIME_MAIL_PARSER, Timeout.InfiniteTimeSpan);
//EmailAnalyzer is a custom class I use to manage the accounts
ea1 = new EmailAnalyzer(Config1);
ea2 = new EmailAnalyzer(Config2);
ea3 = new EmailAnalyzer(Config3);
}
protected void EmailParserWorker(object state)
{
try
{
// Pause timer during processing so it won't be run twice if the processing takes longer than the interval
mailParserTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
// MANAGE THE THREE EMAIL ACCOUNTS
}
catch (Exception ex)
{
log.Error("[EmailParserWorker] Exception caught:" + ex.Message, ex.InnerException);
}
// Launch again in the specified time
mailParserTimer.Change(SLEEP_TIME_MAIL_PARSER, Timeout.InfiniteTimeSpan);
}
我的问题是何时必须管理三个电子邮件帐户。我的经理要求我使用线程,以便它们可以同时 运行,在调查了一些关于 Threads
和 Tasks
之后,我很困惑哪个是我的最佳选择.我知道 ThreadPooling
是不可能的,因为我在某处读到如果操作持续超过几秒钟(我的肯定会),则不应使用这些;但 Task
不使用此功能吗?我知道它有一个 LongRunning 选项,但我不知道我的流程是否符合条件。然后是 Threads
,它应该能够毫无问题地处理这个问题,但我不知道它在 CPU 的使用方面是否会非常低效。
基本上,我不知道我应该使用其中的哪一个。现在我倾向于 Tasks
,但我不知道是否应该指定 LongRunning 令牌。而且,如果相关的话,这些线程或任务将 运行 在使用计时器的方法中运行这一事实是否会影响任何事情?
LongRunning
实际上意味着 "always start a new thread right now"。这没有记录,但出于兼容性原因,此行为永远不会改变。
您应该使用 Task
和 LongRunning
。这严格优于 Thread
。特别是错误处理和组合要好得多。
线程的启动和销毁都是毫秒级的事情。大概 1 毫秒左右。不用担心启动3个线程。
does the fact that these threads or tasks will be running inside a method using timer affect anything at all?
他们不会在定时器方法中运行宁。定时器方法将启动一个快速操作的任务。线程池上的计时器滴答回调 运行。这在这里不是问题,因为您正在将工作卸载到专用线程。
我有一个 windows 服务,运行 有两种方法;一种使用 Ae.Net.Mail
库每 5 分钟从三个电子邮件帐户读取未读电子邮件(我们称之为 EmailParserWorker),另一种方法每 30 分钟进行一次未指定的作业。因为这些方法必须 运行 每 X 时间,我使用 Timer
来管理它们,它们工作正常。
private Timer mailParserTimer;
private readonly TimeSpan SLEEP_TIME_MAIL_PARSER = TimeSpan.FromSeconds(300d);
/*...*/
public MyService()
{
ServiceName = _serviceName;
mailParserTimer = new Timer(new TimerCallback(EmailParserWorker), null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
}
public void StartService()
{
mailParserTimer.Change(SLEEP_TIME_MAIL_PARSER, Timeout.InfiniteTimeSpan);
//EmailAnalyzer is a custom class I use to manage the accounts
ea1 = new EmailAnalyzer(Config1);
ea2 = new EmailAnalyzer(Config2);
ea3 = new EmailAnalyzer(Config3);
}
protected void EmailParserWorker(object state)
{
try
{
// Pause timer during processing so it won't be run twice if the processing takes longer than the interval
mailParserTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
// MANAGE THE THREE EMAIL ACCOUNTS
}
catch (Exception ex)
{
log.Error("[EmailParserWorker] Exception caught:" + ex.Message, ex.InnerException);
}
// Launch again in the specified time
mailParserTimer.Change(SLEEP_TIME_MAIL_PARSER, Timeout.InfiniteTimeSpan);
}
我的问题是何时必须管理三个电子邮件帐户。我的经理要求我使用线程,以便它们可以同时 运行,在调查了一些关于 Threads
和 Tasks
之后,我很困惑哪个是我的最佳选择.我知道 ThreadPooling
是不可能的,因为我在某处读到如果操作持续超过几秒钟(我的肯定会),则不应使用这些;但 Task
不使用此功能吗?我知道它有一个 LongRunning 选项,但我不知道我的流程是否符合条件。然后是 Threads
,它应该能够毫无问题地处理这个问题,但我不知道它在 CPU 的使用方面是否会非常低效。
基本上,我不知道我应该使用其中的哪一个。现在我倾向于 Tasks
,但我不知道是否应该指定 LongRunning 令牌。而且,如果相关的话,这些线程或任务将 运行 在使用计时器的方法中运行这一事实是否会影响任何事情?
LongRunning
实际上意味着 "always start a new thread right now"。这没有记录,但出于兼容性原因,此行为永远不会改变。
您应该使用 Task
和 LongRunning
。这严格优于 Thread
。特别是错误处理和组合要好得多。
线程的启动和销毁都是毫秒级的事情。大概 1 毫秒左右。不用担心启动3个线程。
does the fact that these threads or tasks will be running inside a method using timer affect anything at all?
他们不会在定时器方法中运行宁。定时器方法将启动一个快速操作的任务。线程池上的计时器滴答回调 运行。这在这里不是问题,因为您正在将工作卸载到专用线程。