Domanda

So che ci sono vari modi per limitare la durata di esecuzione di un'attività in .Net e mi chiedevo se ce ne fossero altre che mi sono perso o modifiche / miglioramenti ai metodi che ho usato in precedenza.

Laddove non sono chiaro come funzioni esattamente una metodologia, ho incluso delle domande.

Metodi esistenti di cui sono a conoscenza anche se non necessariamente utilizzati personalmente:

  1. Crea un Thread, chiedi che finisca per un certo periodo di tempo, quindi interrompi il thread. Questa soluzione non è eccezionale in quanto si basa su ThreadAbortException che sono un po 'sgradevoli e se ricordo che non hai alcuna garanzia su dove uscirà il codice, ad esempio potrebbe lasciare risorse inutilizzate, ecc.
  2. Usa il modello IAsyncResult, il problema con questo è che puoi aspettare un certo periodo di tempo ma non c'è un modo semplice per segnalare che vuoi che la richiesta venga interrotta quindi devi fare affidamento sull'impostazione di un booleano flag (o simile) che viene controllato all'interno del codice asincrono e lo fa arrestare. Il problema qui è che se il codice asincrono è bloccato in una determinata sezione del codice, potrebbe continuare a funzionare per un po 'di tempo prima di terminare effettivamente.
  3. Ho spesso visto persone consigliare BackgroundWorker per cose asincrone, ma puoi usarlo sotto ASP.Net (presumo di sì) e ha un modo semplice per terminare il processo asincrono dopo un certo tempo?
  4. Usa l'API Task in .Net 4.0 (attualmente tutto il mio lavoro è limitato a .Net 3.5, quindi non è un'opzione per me). Da una rapida lettura della documentazione MSDN sembra che tu possa annullare facilmente un'attività utilizzando CancellationToken, ma quanto velocemente ha effetto una cancellazione e garantisce che tutti i blocchi finally vengano chiamati.

Tutte le soluzioni / suggerimenti / metodologie sono benvenute

È stato utile?

Soluzione

La forma di cancellazione più sicura è sempre cooperativa.

Consiglio di non uccidere mai un thread (tramite ThreadAbortException). Se non hai assolutamente scelta, rendi quel codice un processo separato, che può essere eliminato in modo pulito. Gli AppDomain erano una bella idea, ma non reggono il confronto con il mondo reale.

IAsyncResult, BackgroundWorker e CancellationToken sono tutte forme di cancellazione cooperativa. Quindi sono tutti molto puliti (non perdono risorse, chiamano blocchi finally, ...), ma hanno lo svantaggio di non poter gestire il codice "canaglia".

Se stai scrivendo il codice dell'attività in background, utilizza semplicemente BackgroundWorker o CancellationToken. Se devi lavorare con codice possibilmente "canaglia", includilo in un processo separato.

BackgroundWorker funzionerà perfettamente in ASP.NET e supporta la cancellazione cooperativa .

Altri suggerimenti

Il token di cancellazione da 4 e il flag booleano da 2 sono lo stesso tipo di meccanismo.In entrambi i casi il compito deve cooperare e controllare regolarmente la bandiera.Il vantaggio di 4 è che hai un flag standardizzato invece di crearne uno tuo.

Interrompere i thread è dannoso, ma gestibile se il codice è scritto con attenzione.In particolare è facile corrompere lo stato globale.

La versione sicura dell'annullamento di un thread lo esegue in un dominio app diverso.Quindi scarichi il dominio dell'app una volta che il thread è stato ucciso.Funzionerà in modo sicuro se tutte le risorse non gestite hanno finalizzatori critici corretti / utilizzano SafeHandles.

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