2015-10-07 5 views
1

Я настраиваю службу очереди заданий и вам необходимо дросселировать потоки, а также ограничить срок службы работы в потоке, а не самой жизнью нити. Пожалуйста, не попадайте в мыльницу о том, насколько плох Thread.Abort(). Я тщательно рассмотрел последствия двух зол, и в моем случае это лучший выбор. Abort() никогда не может быть вызван, но если это произойдет, это будет необходимо. Я могу получить дросселирование и время жизни нити, чтобы работать со следующим кодом, но таймер запускается даже тогда, когда задание ожидает запуска из-за превышения порога дроссельной заслонки. Есть ли способ заставить таймер начать ТОЛЬКО, когда начинается задание, а не только поток?Дросселирование нити с таймером продолжительности жизни

Спасибо

Earl

  var workerThread = new Thread(() => 
      { 
       concurrencySemaphore.Wait(); 
       try 
       { 

        consumerHelper.Execute(job, JobMessage, communicate);; 
       } 
       finally 
       { 

        concurrencySemaphore.Release(); 
       } 

      }); 

      var timeoutTimer = new System.Threading.Timer((s) => 
      { 
       workerThread.Abort(); 
      }, null, jobTimeSpan, TimeSpan.FromHours(12)); 

      workerThread.Start(); 

Что мне нужно таймер, чтобы начать, когда работа фактически начинает работать, а не только тогда, когда поток начинает работать.

ответ

1

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