Вопрос

Я хочу реализовать таймаут выполнения задач в проекте, использующем 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top