Как прервать CCR темы \ задачи? - PullRequest
1 голос
/ 13 июля 2009

Я хочу реализовать тайм-аут на выполнение задач в проекте, который использует CCR. Обычно, когда я отправляю элемент в порт или ставлю задачу в очередь в DispatcherQueue, я хочу иметь возможность прервать задачу или поток, в котором она выполняется, если это займет больше времени, чем настроенное время. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 19 июля 2009

Можете ли вы подтвердить, что вы спрашиваете? Вы выполняете долгосрочное задание в Диспетчере? Уничтожение потока нарушит модель CCR, поэтому вы должны иметь возможность дать сигнал потоку, чтобы он закончил свою работу и дал результат. Предполагая, что цикл завершается недостаточно быстро, вы можете поставить таймер в очередь:

var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

и убедитесь, что в блокирующем потоке есть ссылка на resultTimeoutPort. В цикле блокировки одним из условий выхода может быть:

do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

Пожалуйста, напишите больше информации, если я лаю не на том дереве.

0 голосов
/ 06 октября 2009

Вы можете зарегистрировать поток (Thread.CurrentThread) в начале вашего обработчика CCR «Receive» (или в методе, который вызывает ваш метод через делегата). Затем вы можете выполнять периодическую проверку и при необходимости прерывать работу, как если бы вы создавали поток вручную. Загвоздка в том, что если вы используете свой собственный Microsoft.Ccr.Core.Dispatcher с фиксированным числом потоков, я не думаю, что есть способ вернуть эти потоки обратно, как только вы прервете их (основываясь на моем тестировании). Таким образом, если у вашего диспетчера 5 потоков, вы сможете прервать его только 5 раз, прежде чем публикация перестанет работать, независимо от того, какие задачи были зарегистрированы. Однако если вы создаете DispatcherQueue с использованием пула потоков CLR, все прерывания CCR, которые вы прервете, будут автоматически заменены, и у вас не возникнет этой проблемы. Из того, что я видел, хотя диспетчер CCR рекомендуется, я думаю, что использование пула потоков CLR - путь в этой ситуации.

...