Pergunta

Eu quero implementar um tempo limite sobre a execução de tarefas em um projeto que usa a CCR. Basicamente, quando eu postar um item para um porto ou enfileirar uma tarefa para um DispatcherQueue eu quero ser capaz de abortar a tarefa ou o fio que a sua execução em se leva mais tempo do que algum tempo configurado. Como posso fazer isso?

Foi útil?

Solução

Pode confirmar que você está pedindo? Você está executando uma tarefa de longo viveu no Dispatcher? Matar o fio iria quebrar o modelo CCR, então você precisa ser capaz de sinalizar para o segmento concluir seu trabalho e rendimento. Assumindo que é um loop que não está terminando rápido o suficiente, você pode escolher para enfileirar um temporizador:

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

e garantir o fio de bloqueio tem uma referência disponível para resultTimeoutPort. No circuito de bloqueio, uma das condições de saída podem ser:

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

Por favor, poste mais informações se estou latindo para a árvore errada.

Outras dicas

Você pode registrar o thread (Thread.currentThread) no início do seu CCR "Receber" manipulador (ou em um método que chama o seu método através de um delegado). Então você pode fazer a sua verificação periódica e abortar, se necessário, basicamente, da mesma forma que teria feito se você tiver criado o fio manualmente. O problema é que se você usar o seu próprio Microsoft.Ccr.Core.Dispatcher com um número fixo de threads, eu não acho que há uma maneira de obter esses tópicos de volta depois de abortar los (com base no meu teste). Então, se seu expedidor tem 5 tópicos, você só será capaz de abortar 5 vezes antes de postar deixarão de funcionar independentemente do que as tarefas foram registrados. No entanto, se você construir um DispatcherQueue usando o pool de thread CLR, qualquer segmentos CCR você abortar será substituído automaticamente e você não terá esse problema. Pelo que tenho visto, embora o despachante CCR é recomendado, acho que usando o pool de thread CLR é o caminho a percorrer nesta situação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top