簡體   English   中英

長期運行的任務或線程?

[英]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);
}

我的問題是我必須管理三個電子郵件帳戶。 我的經理讓我使用線程,以便它們可以同時運行,在調查了一些關於ThreadsTasks ,我很困惑哪個是我最好的選擇。 我知道ThreadPooling是不可能的,因為我讀到某個地方,如果操作將持續超過幾秒鍾,那么不應該使用它們(我當然會這樣做); 但是沒有Task使用這個功能嗎? 我知道它有一個LongRunning選項,但我不知道我的進程是否合格。 然后有Threads ,應該能夠毫無問題地處理這個問題,但我不知道它在CPU使用方面是否會非常低效。

基本上,我不知道我應該使用哪一個。 現在我傾向於Tasks ,但我不知道是否應該指定LongRunning令牌。 而且,如果相關,這些線程或任務將在使用計時器的方法內運行的事實是否會影響任何事情?

LongRunning實際上意味着“始終立即啟動新線程”。 這沒有記錄,但出於兼容性原因,這種行為永遠不會改變。

你應該使用TaskLongRunning 這嚴格優於Thread 特別是錯誤處理和組合要好得多。

啟動和銷毀線程只需幾毫秒。 像1ms左右。 不要擔心啟動3個線程。

事實上這些線程或任務將在使用計時器的方法中運行會影響任何事情嗎?

它們不會在計時器方法中運行。 計時器方法將啟動快速操作的任務。 計時器刻度回調在線程池上運行。 這不是一個問題,因為您正在將工作卸載到專用線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM