Busca lo que quieras

Llamar método por otro hilo sin peligro a caerse en .NET

IIS por defecto tiene la maña de coger tus hilos que lanzes por segundo plano y MATARLOS.

Que asesino eres IIS!

Entonces, lo que necesitamos es colocarnos un ESCUDO PROTECTOR!.

Para lograrlo entonces tenemos que implementar una clase (que por cierto no hice yo, sino un duro de stackoverflow y que lo compartió al mundo... gracias stackoverflow y Gervasio Marchand).

Ojo que hay que importar lo siguiente en la clase:

using System.Web.Hosting;
using System.Threading.Tasks;

Esta es la clase:

 public class BackgroundWorker
    {
        /// <summary>
        /// Runs a background task that is registered with the hosting environment
        /// so it is guaranteed to finish executing.
        /// </summary>
        /// <param name="action">The lambda expression to invoke.</param>
        public static void Run(Action action)
        {
            new IISBackgroundTask().DoWork(action);
        }

        /// <summary>
        /// Generic object for completing tasks in a background thread
        /// when the request doesn't need to wait for the results 
        /// in the response.
        /// </summary>
        class IISBackgroundTask : IRegisteredObject
        {
            /// <summary>
            /// Constructs the object and registers itself with the hosting environment.
            /// </summary>
            public IISBackgroundTask()
            {
                HostingEnvironment.RegisterObject(this);
            }

            /// <summary>
            /// Called by IIS, once with <paramref name="immediate"/> set to false
            /// and then again with <paramref name="immediate"/> set to true.
            /// </summary>
            void IRegisteredObject.Stop(bool immediate)
            {
                if (_task.IsCompleted || _task.IsCanceled || _task.IsFaulted || immediate)
                {
                    // Task has completed or was asked to stop immediately, 
                    // so tell the hosting environment that all work is done.
                    HostingEnvironment.UnregisterObject(this);
                }
            }

            /// <summary>
            /// Invokes the <paramref name="action"/> as a Task.
            /// Any exceptions are logged
            /// </summary>
            /// <param name="action">The lambda expression to invoke.</param>
            public void DoWork(Action action)
            {
                try
                {
                    _task = Task.Factory.StartNew(action);
                }

                catch (Exception ex)
                {
                    //Logger.Log(ex);
                }
            }

            private Task _task;

        }
    }

Una vez tengamos la clase metida en nuestro cs o donde vayas a lanzar el método sencillamente puedes llamarlo así:

BackgroundWorker.Run(() =>
                                      MiMetodoAsincronoConEscudo(parametro1, parametro2, parametro3)
                                );// run this in a background thread

Y todos seamos felices!!! Ahora nunca nuestros hilos de segundo plano los matará IIS... GAnamos!!!!!

Para más información puedes mirar los siguientes links:

El peligro de implementar tareas en segundo plano.

Una confirmación de que IIS mata los hilos

El link que nos salva a todos.

Y de nuevo una explicación detallada de como podría funcionar el ESCUDO

Aquí hay un framework que ayuda a esto también.

Sean felices! :) Y siéntanse libres de opinar ;)

No hay comentarios:

Publicar un comentario

Palabras Clave

.NET (93) AJAX (2) ajaxcontroltoolkit (2) Algoritmos (1) android (1) Angular (1) Arrays (1) AS2 o ActionScript 2.0 (1) AS3 o ActionScript 3.0 (64) ASP (7) ASP.NET (3) Azure (1) Azure DevOps (2) Backup (2) Batch (4) blogger (1) Browser Support (2) C# (53) Charts (1) Chorme extensions (1) Chrome (3) cmd (18) código postal (1) Colombia tips (1) command (1) Conexion remota (1) Controles Web .NET (24) Cookies (1) cordova (1) CSS (14) CSV (5) Cufon (1) DateTime (2) deployment (2) Desarrollo movil (2) Desarrollo web (5) Diseño (4) DNN o DotNetNuke (5) docker (1) Encuestas (1) Entity Framework (1) Error (1) Eval (2) Excel (4) Expresiones regulares (2) Facebook (14) fechas (1) Fiddler (1) FileUpload (1) Filezilla (1) Firefox (2) Flash (9) Fonts (3) FQL (1) frameworks (2) Futuro de la web (1) git (1) Google Code (13) Google Maps (4) hackintosh (3) hazard 10.6.2 (3) herramientas para developers (1) highchart (1) Hilos (2) Hosting Windows (18) HTML (38) HTML5 (6) IDE (1) IE (2) IE9 (1) IIS (13) imagenes (3) jasmine (2) java (1) jqgrid (2) Jquery y Javascript (90) jquery-ui (5) jQueryMobile (1) JSON (1) knockout (4) library (1) Link Interesantes (2) List (1) Macro (2) Matemáticas (2) Membership (6) Memoria (1) Mis Experiencias (3) momentjs (1) ms-dos (1) MSN (1) MVC (1) MVC4 (3) MySQL (2) node.js (4) Notepad++ (3) Notificaciones (1) ObjectDataSource (2) Online (2) Opinión (4) OSX (3) Parallels Plesk Panel (1) petapoco (1) PhantomJS (1) PHP (4) Porqué este blog (1) Powershell (1) Razor (3) Redes (2) REGEX (4) REST (1) SDK Android (1) Seguridad (1) SelectParameters (1) Selenium (2) sencha (3) sencha cmd (2) SEO (1) SMTP (2) Software útil (8) Solución (1) Soporte (1) SQL (15) SQL Server (58) SQLite (2) Store Procedures (20) String (5) Testing Code (2) texto (2) tips de datos (1) tips de desarrollo (1) TutoFaceAS3 (4) TutoProAS3 (4) Tutoriales (7) Tweenlite effects (3) Últimas noticias (1) unit testing (1) usb (1) VBA (1) Video (1) virus (1) Web API (2) Web Browsers (1) Web Forms (7) web.config (1) Webmaster (8) Webmatrix (1) webrole (1) webservices (1) webstorm (1) Win Forms (5) Windows (21) Windows 7 (1) Windows 8 (1) XML (2) Youtube API (2)