none
TASK - Como Cancelar manejar Exepciones en Tareas Anidadas RRS feed

  • Pregunta

  • Saludos, en esta ocasion tengo que manejar Exepciones en tareas anidadas, he leido la ayuda de msdn, pero no se como puedo manejarlas paso el codigo completo para que se entienda mejor lo que quiero hacer

            string breakLine;
    
            readonly System.Threading.CancellationTokenSource cancelTask;
    
            System.Threading.CancellationToken token;
            
            private Task MainTask
            {
                get
                {
                    var task  = new Task(() =>
                    {
                        Tarea1();
    
                        Task.Factory.StartNew(() =>
                        {
                            Tarea2();
                        }, token).ContinueWith(t3 =>
                        {
                            Tarea3();
    
                            Task.Factory.StartNew(() =>
                            {
                                Tarea4();
                            }, token).ContinueWith(t5 =>
                            {
                                Tarea5();
    
                                Task.Factory.StartNew(() =>
                                {
                                    Tarea6();
                                }, token).ContinueWith(t7 =>
                                {
                                    Tarea7();
                                }, token);
                            }, token);
                        }, token);
                    }, token);
    
                    return task;
                }
            }
    
            public Form1()
            {
                InitializeComponent();
    
                cancelTask = new System.Threading.CancellationTokenSource();
                token = cancelTask.Token;
    
                token.Register(() => 
                {
                    MessageBox.Show("Tarea Cancelada");
                    token = cancelTask.Token;
                    
                });
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                textBox1.Clear();
    
                breakLine = Environment.NewLine + Environment.NewLine;
    
                try
                {
                    MainTask.Start();
                }
                catch (AggregateException ae)
                {
                    foreach (var x in ae.InnerExceptions)
                    {
                        throw x;
                    }
                }
            }
    
            void Tarea1()
            {
                System.Threading.Thread.Sleep(1000);
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() => 
                    {
                        textBox1.Text += "Crear Proceso 1" + breakLine;
                        this.Refresh();
                    }));
                }
            }
    
            void Tarea2()
            {
                System.Threading.Thread.Sleep(1000);
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += "Agencias 2" + breakLine;
                        this.Refresh();
                    }));
                }
            }
    
            void Tarea3()
            {
                System.Threading.Thread.Sleep(1000);
                
                if (cancelTask.IsCancellationRequested)
                {
                    return;
                }
    
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += "Envios 3" + breakLine;
                        this.Refresh();
                    }));
                }
            }
    
            void Tarea4()
            {
                System.Threading.Thread.Sleep(1000);
                
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        try
                        {
                            object v = null;
                            v.ToString();
                            textBox1.Text += "Envios Cancelados 4" + breakLine;
                        }
                        catch (Exception ex)
                        {
                            throw new NullReferenceException("Exepcion desde el metodo Tarea 4", new Exception("Provada Por Mi"));
                        }
                        
                        Refresh();
                    }));
                }
            }
    
            void Tarea5()
            {
                System.Threading.Thread.Sleep(1000);
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += "Envios Transmitidos 5" + breakLine;
                        this.Refresh();
                    }));
                }
            }
    
            void Tarea6()
            {
                System.Threading.Thread.Sleep(1000);
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += "Envios Devueltos 6" + breakLine;
                        this.Refresh();
                        
                    }));
                }
            }
    
            void Tarea7()
            {
                System.Threading.Thread.Sleep(1000);
                if (InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += "Envios Pagados 7" + breakLine;
                        this.Refresh();
                    }));
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                cancelTask.Cancel();
            }

    si nos fijamos en la tarea 4 Lanzo un NullReferenceExeption para simular que ha ocurrido una exepcion, y ademas, cuando mando a que se ejecute la tarea manejo las exepciones con AggregateExeption como dice la guia pero siempre mi codigo dice que no se manejo la exepcion, al final lo que quiero intentar es manejar las exepciones ocurridas en cualquier hilo en un solo sitio 

    Gracias de antemano


    Luis Y. Ramirez "Recuerda marcar la repuesta como VALIDA si te ha ayudado"


    jueves, 9 de agosto de 2012 15:50

Todas las respuestas