Domanda

Voglio realizzare un timeout sull'esecuzione di attività di un progetto che utilizza il CCR. Fondamentalmente, quando ho posto un elemento a un porto o Enqueue una missione a un DispatcherQueue voglio essere in grado di interrompere l'attività o il filo che la sua esecuzione su se ci vuole più di un po 'di tempo configurato. Come posso fare questo?

È stato utile?

Soluzione

Puoi confermare quello che stai chiedendo? Sei in esecuzione di un compito di lunga durata nel Dispatcher? Uccidere il filo si spezzasse il modello CCR, quindi è necessario essere in grado di segnalare al thread per finire il suo lavoro e la resa. Supponendo che è un ciclo che non sta finendo abbastanza veloce, si potrebbe scegliere di accodare un timer:

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

e assicurare il filo di blocco ha a disposizione un riferimento a resultTimeoutPort. Nel ciclo di blocco, potrebbe essere una delle condizioni di uscita:

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

Si prega di inviare più informazioni se sto abbaiare contro l'albero sbagliato.

Altri suggerimenti

Si potrebbe registrare il filo (Thread.currentThread) all'inizio del CCR "Receive" handler (o in un metodo che chiama il metodo tramite un delegato). Poi si può fare il vostro controllo periodico e, se necessario, interrompere sostanzialmente allo stesso modo avresti fatto se è stato creato il filo manualmente. Il problema è che se si utilizza il proprio Microsoft.Ccr.Core.Dispatcher con un numero fisso di thread, non credo che ci sia un modo per ottenere quei fili di nuovo una volta che li interrompe (in base alla mia test). Quindi, se il committente ha 5 fili, sarete solo in grado di interrompere 5 volte prima di pubblicare non funzionerà indipendentemente da ciò che sono stati registrati compiti. Tuttavia, se si costruisce un DispatcherQueue utilizzando il pool di thread CLR, qualsiasi thread CCR si interrompe verranno sostituiti automaticamente e non avrà questo problema. Da quello che ho visto, anche se si consiglia il dispatcher CCR, penso che utilizzando il pool di thread CLR è la strada da percorrere in questa situazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top