2015-09-02 2 views
0

У меня есть класс, который реализует бесконечный рабочий поток, например, this, например, в моем случае, представляющем тело. Во время выполнения я буду иметь от 0 до ~ 8 экземпляров в реальном времени в любое время с постоянно создаваемыми и уничтожаемыми экземплярами.Threadpool с бесконечными рабочими потоками

В большинстве случаев этот класс имеет жизненный цикл от 30 секунд до 5 минут, но иногда может быть несколько экземпляров, созданных и уничтоженных за относительно короткий период времени. Именно здесь я склонен сталкиваться с проблемами производительности, учитывая низкую спецификацию аппаратного обеспечения, на котором этот код работает.

Теперь я хотел бы переписать поведение, чтобы использовать ThreadPool для моей коллекции работающих рабочих, и я изо всех сил пытаюсь найти правильный способ структурирования кода.

В основном код у меня есть на данный момент что-то вроде

public class BodyCollection : IReadOnlyDictionary<ulong, TrackedBody> 
{ 
    public void Update() 
    { 
     if (createNew) 
     { 
      var body = new TrackedBody(); 
      body.BeginTracking(); 
      this.Add(1234, body); 
     } 

     if (remove) 
     { 
      TrackedBody body = this[1234]; 
      body.StopTracking(); 
      this.Remove(body); 
     } 
    } 
} 

public class TrackedBody 
{ 
    private readonly Thread _BiometricsThread; 
    private volatile bool _Continue = true; 

    public TrackedBody() 
    { 
     _BiometricsThread = new Thread(RunBiometricsThread); 
    } 

    public void BeginTracking() 
    { 
     _BiometricsThread.Start(); 
    } 

    public void StopTracking() 
    {  
     _Continue = false; 
    } 

    private void RunBiometricsThread() 
    { 
     while(_Continue) 
     { 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 
} 

Так как же я вновь пишу выше, чтобы использовать ThreadPool правильно и так, что я могу отменить запуск темы на ThreadPool по мере необходимости? Я использую CancellationTokens или ManualResetEvents для управления потоками?

+1

Вы просто этого не делаете, потоки, подобные этим, являются ядом для пула потоков. Они предотвращают своевременное обслуживание других потоков tp. Разумный максимум составляет полсекунды, за что он начинает плохо забивать трубы. Не делай этого. –

+0

@HansPassant Я вижу ... Не могли бы вы сказать, что приведенное выше верно, если даже ваше приложение - это ТОЛЬКО приложение, работающее на данном устройстве? –

+0

Это не имеет ничего общего с приложениями, это касается потоков. –

ответ

1

Я твердо верю, что вы должны использовать более современные методы асинхронного программирования. Мы будем использовать библиотеки Task Parallel Library здесь, потому что это дает вам возможности, которые вы хотите бесплатно:

  • завершение Tracking
  • Отмена
  • бассейн Thread

public class TrackedBody 
{  
    public Task BeginTrackingAsync(CancellationToken cancellation) 
    { 
     return Task.Run(() => RunBiometricsThread(cancellation)); 
    } 

    private void RunBiometricsThread(CancellationToken cancellation) 
    { 
     while(!cancellation.IsCancellationRequested) 
     { 
      Task.Delay(1000, cancellation); 
     } 
    } 
} 

Обратите внимание, что я удалил ключевое слово async. Это ничего не делало само по себе.

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

+0

Ключевое слово async было только опечаткой. Я знаю, что он ничего не делал сам по себе, но что касается остального вашего примера, который мог бы работать, у меня будет игра с таким подходом и будет любопытно, как создавать несколько задач. Я бы предположил, что он должен быть быстрее, чем потоки. Я мог бы поклясться, что в какой-то момент я попытался что-то подобное, но он не работал в моем контексте (и, следовательно, почему я вернулся к традиционным потокам), но снова посмотрю с новым лицом. Спасибо за ваш вклад, очень ценный –

+0

@MaximGershkovich Преимущество threadpool в том, что относительно дорогостоящая операция создания и регистрации потоков уже выполнена. Других преимуществ и некоторых недостатков, связанных с перерывом, нет, кроме того, что они недостоверны, а также хрупкость локального хранилища потоков. – Gusdor

Смежные вопросы