Как прервать потоки\задачи CCR?
Вопрос
Я хочу реализовать таймаут выполнения задач в проекте, использующем CCR.По сути, когда я отправляю элемент в порт или ставлю задачу в очередь в DispatcherQueue, я хочу иметь возможность прервать задачу или поток, в котором она выполняется, если это занимает больше времени, чем определенное настроенное время.Как я могу это сделать?
Решение
Можете ли вы подтвердить то, что спрашиваете?Вы выполняете долгосрочную задачу в Диспетчере?Закрытие потока нарушит модель CCR, поэтому вам необходимо иметь возможность подать сигнал потоку о завершении его работы и выходе.Предполагая, что это цикл, который завершается недостаточно быстро, вы можете поставить в очередь таймер:
var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT),
resultTimeoutPort);
и убедитесь, что блокирующий поток имеет ссылку на resultTimeoutPort.В цикле блокировки одним из условий выхода может быть:
do
{
//foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
someOtherCondition)
Пожалуйста, опубликуйте дополнительную информацию, если я лаю не на то дерево.
Другие советы
Вы можете зарегистрировать поток (Thread.CurrentThread) в начале обработчика «Receive» CCR (или в методе, который вызывает ваш метод через делегата).Затем вы можете выполнять периодическую проверку и при необходимости прерывать ее, в основном так же, как если бы вы создавали поток вручную.Загвоздка в том, что если вы используете свой собственный Microsoft.Ccr.Core.Dispatcher с фиксированным количеством потоков, я не думаю, что есть способ вернуть эти потоки после их прерывания (на основе моего тестирования).Таким образом, если у вашего диспетчера 5 потоков, вы сможете прервать работу только 5 раз, прежде чем публикация перестанет работать, независимо от того, какие задачи были зарегистрированы.Однако если вы создадите DispatcherQueue с использованием пула потоков CLR, любые прерванные вами потоки CCR будут заменены автоматически, и у вас не возникнет этой проблемы.Судя по тому, что я видел, хотя рекомендуется использовать диспетчер CCR, я думаю, что в этой ситуации лучше всего использовать пул потоков CLR.