2015-02-10 9 views
5

Pianifico il lavoro utilizzando la libreria hangfire.io e posso osservare che viene elaborato nella dashboard incorporata. Tuttavia, il mio sistema ha bisogno che il lavoro possa essere cancellato dalla dashboard.Annulla lavoro in esecuzione pianificato con Hangfire.io

Esiste un'opzione per eliminare il lavoro in esecuzione, ma questo modifica solo lo stato del lavoro nel database e non interrompe l'esecuzione del lavoro.

Vedo in documentazione c'è l'opzione per passare IJobCancellationToken tuttavia, a quanto ho capito, viene utilizzato per arrestare correttamente il lavoro quando l'intero server si sta spegnendo.

C'è un modo per ottenere l'annullamento programmatico dell'attività già in esecuzione?

Devo scrivere il mio componente che periodicamente richiama il database e controlla se l'istanza del server corrente sta eseguendo un lavoro che è stato cancellato? Ad esempio, mantieni il dizionario jobId -> CancellationTokenSource e poi segnala la cancellazione usando tokensource appropriato.

+1

Hi hai mai scoprire come annullare/eliminare un'operazione in coda o in esecuzione>? –

+1

Per annullare un lavoro a livello di codice, chiamare 'BackgroundJob.Delete'. Vedi: http://discuss.hangfire.io/t/cancel-a-running-job/603 – Dejan

+0

@Dejan - grazie –

risposta

3

La documentazione è incompleta. IJobCancellationToken.ThrowIfCancellationRequested metodo genera un'eccezione dopo qualsiasi delle seguenti condizioni soddisfatte:

  1. arresto Hangfire Server iniziati. Questo evento viene attivato quando qualcuno chiama i metodi Stop o Dispose di BackgroundJobServer.
  2. Il processo in background non è nello stato Processed.
  3. Il lavoro in background viene eseguito da un altro operatore.

Gli ultimi due casi vengono eseguiti interrogando la memorizzazione dei lavori per lo stato corrente del processo in background. Pertanto, il token di cancellazione verrà generato se lo elimini o lo ri-accodati anche dalla dashboard.

+1

Ok, grazie. Stavo controllando il flag su 'ShutdownToken' invece di usare ThrowIfCancellationRequested che estrae internamente il database. – llapinski

0

Questo funziona se si elimina il lavoro dal cruscotto

static public void DoWork(IJobCancellationToken cancellationToken) 
{ 
    Debug.WriteLine("Starting Work..."); 
    for (int i = 0; i < 10; i++) 
    { 
     Debug.WriteLine("Ping"); 

     try 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 

     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("ThrowIfCancellationRequested"); 
      break; 
     } 
     //Debug.WriteProgressBar(i); 
     Thread.Sleep(5000); 
    } 

    Debug.WriteLine("Finished."); 
} 
Problemi correlati