Перезапустить задачу или создать новую? - PullRequest
11 голосов
/ 13 сентября 2010

Я работаю над проектом, который создает около 20 ~ 50 новых задач каждые 30 ~ 80 секунд. Каждое задание длится 10 ~ 20 секунд.

Поэтому я использую Таймер для создания этих новых задач, но каждый раз, когда я всегда воссоздаю одну и ту же задачу, код выглядит так:

public class TaskRunner : IDisposable
{
    private readonly Timer timer;
    public IService service;

    public ThreadRunner(IService service) {
            this.service = service;
            timer = new Timer(10000);
            timer.Elapsed += Execute;
            timer.Enabled = true;
        }
    }

    private void Execute(object sender, ElapsedEventArgs e)
    {
        try
        {
            Task.Factory.StartNew(service.Execute);
        }
        catch (Exception ex)
        {
            logger.ErrorFormat("Erro running thread {0}. {1}", service, ex);
        }
    }

    public void Dispose()
    {
        timer.Dispose();
    }
}

У меня вопрос, есть ли способ создать задачу и продолжать ее перезапуск, поэтому мне не нужно запускать новую задачу Task.Factory.StartNew (service.Execute); каждый раз?

Или это то, о чем мне не нужно беспокоиться, и можно продолжать создавать новые задачи?

Есть какое-нибудь руководство / лучшие практики о том, как мне следует работать в этом сценарии с такими потоками?

Ответы [ 3 ]

8 голосов
/ 13 сентября 2010

Ваш метод Execute уже выполняется в потоке.Поток потока, который был запущен System.Timers.Timer, который вы используете, чтобы вызвать событие Elapsed.Не начинайте другую ветку, просто используйте ту, которая была вам вручена.Потоки потоков очень дешевы и перерабатываются автоматически.

7 голосов
/ 13 сентября 2010

На пересмотренный вопрос:

мне каждый раз создавать новое задание или я могу просто перезапустить его?

Ответ должен быть очень четким: да, каждый раз используйте новый. Ни в коем случае не пытайтесь повторно использовать задачу: чем короче, тем лучше.

Хотя создание потоков очень дорого, задачи уже используют ThreadPoool для решения этой проблемы. Не вмешивайтесь в это, вы будете только создавать проблемы.

1 голос
/ 13 сентября 2010

Вместо того, чтобы перезапускать каждый из потоков при срабатывании таймера, почему бы не каждому потоку запустить цикл, который выполняет указанный код с необходимой частотой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...