Подтвердить что ты не робот

Перезапустить задачу или создать новую?

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

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

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); каждый раз?

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

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

4b9b3361

Ответ 1

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

Ответ 2

К пересмотренному вопросу:

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

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

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

Ответ 3

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