コード例 #1
0
 private void PreencherListaPessoas2()
 {
     //O local correto para se tratar exceções em thread é o metodo usado pela thread, não onde ela fica
     try
     {
         //descomente a linha abaixo para ver como e possivel pegar exceção com thread
         //throw new Exception("Teste");
         IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
         List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();
         //Use a instrução lock para sincronizar o acesso de thread com um recurso compartilhado
         lock (locker) //impede que ambas as thread manipulem o mesmo objeto (_pessoas) ao mesmo tempo
         {
             foreach (Pessoa p in pessoas)
             {
                 p.Nome += " Thread 3 ";
                 _pessoas.Add(p);
                 Thread.Sleep(100);
             }
         }
     }
     catch (Exception ex)
     {
         ExibirErro(ex);
     }
 }
コード例 #2
0
        private Task <int> PreencherDataGridView()
        {
            #region aprendendo sobre thread

            /*
             * //Para exceções não adiantaria colocar um try catch aqui no metodo PreencherDataGridView,
             * //exceções devem ser tratadas dentro do metodo utlizado pelas threads
             * Thread.Sleep(5000);
             * Thread thread2 = new Thread(PreencherListaPessoas);
             * Thread thread3 = new Thread(PreencherListaPessoas2);
             * thread2.Start();
             * thread3.Start();
             * //Join é usado para aguardar a finalização de uma thread, sem ele o Invoke chama o DataGridView
             * //antes da thread conseguir preencher o DataGridView com a lista de pessoas do banco de dados
             * thread2.Join();
             * thread3.Join();
             *
             * //como foi a thread do InitializeComponent que criou o form e seus componentes (dgvPessoas)
             * //a thread que criamos não pode alterar diretamente esses componentes, por isso o uso do Invoke
             * dgvPessoas.Invoke((MethodInvoker)delegate
             * {
             *  dgvPessoas.DataSource = _pessoas;
             *  dgvPessoas.Refresh();
             * });
             */
            #endregion

            return(Task <int> .Run(() =>
            {
                Thread.Sleep(2000);
                IRepositorio <Pessoa> repositorioPessoa = new PessoaRepositorio();
                _pessoas = repositorioPessoa.SelecionarTodos();
                return _pessoas.Count;
            }));
        }
コード例 #3
0
        private void CarregarDataGrid()
        {
            IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
            List <Pessoa>         listaPessoas       = repositorioPessoas.SelecionarTodos();

            dgrPessoas.ItemsSource = listaPessoas;
        }
コード例 #4
0
 private Task <int> PreencherDataGridView()
 {
     return(Task <int> .Run(() =>
     {
         Thread.Sleep(5000);
         IRepositorio <Pessoa> repositorio = new PessoaRepositorio();
         _pessoas = repositorio.SelecionarTodos();
         return _pessoas.Count;
     }));
 }
コード例 #5
0
 private void PreencherListaPessoas()
 {
     lock (locker)
     {
         IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
         List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();
         foreach (Pessoa p in pessoas)
         {
             p.nome += " T1";
             _pessoas.Add(p);
         }
     }
 }
コード例 #6
0
 private void Form1_Load(object sender, EventArgs e)
 {
     //Thread thread = new Thread(PreencherDataGridView);
     //thread.Start();
     Task.Run(() =>
     {
         Thread.Sleep(5000);
         IRepositorio <Pessoa> repositorioPessoa = new PessoaRepositorio();
         dgvPessoas.Invoke((MethodInvoker) delegate {
             dgvPessoas.DataSource = repositorioPessoa.SelecionarTodos();
             dgvPessoas.Refresh();
         });
     });
 }
コード例 #7
0
        private void PreencherListaPessoas()
        {
            IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
            List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();

            lock (locker)
            {
                foreach (Pessoa p in pessoas)
                {
                    p.Nome += "Thread 1";
                    _pessoas.Add(p);
                    Thread.Sleep(300);
                }
            }
        }
コード例 #8
0
        private void PreencherListaPessoas()
        {
            IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
            List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();

            //Use a instrução lock para sincronizar o acesso de thread com um recurso compartilhado
            lock (locker) //impede que ambas as thread manipulem o mesmo objeto (_pessoas) ao mesmo tempo
            {
                foreach (Pessoa p in pessoas)
                {
                    p.Nome += " Thread 2 ";
                    _pessoas.Add(p);
                    Thread.Sleep(300);
                }
            }
        }
コード例 #9
0
        private Task <int> PreencherDataGridView()
        {
            ////Thread.Sleep(5000);
            //Thread thread = new Thread(PreencherListPessoas);
            ////Thread thread2 = new Thread(PreencherListPessoas2);
            //thread.Start();
            ////thread2.Start();
            //thread.Join();
            ////thread2.Join();
            //dgvPessoas.Invoke((MethodInvoker)delegate { dgvPessoas.DataSource = _pessoas; dgvPessoas.Refresh(); });
            return(Task <int> .Run(() =>
            {
                //Thread.Sleep(5000);
                IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
                _pessoas = new List <Pessoa>();
                List <Pessoa> temp = repositorioPessoas.SelecionarTodos();

                Parallel.ForEach(temp, (pessoa) =>
                {
                    pessoa.Nome += " - Paralelizar";
                    _pessoas.Add(pessoa);
                });
                return _pessoas.Count();
            }));/*.ContinueWith((taskAnterior) =>
                 * {
                 * try
                 * {
                 *   dgvPessoas.Invoke((MethodInvoker)delegate
                 *   {
                 *       dgvPessoas.DataSource = _pessoas;
                 *       dgvPessoas.Refresh();
                 *   });
                 *   MessageBox.Show(string.Format("Há {0} registros de pessoas", taskAnterior.Result));
                 * }
                 * catch (AggregateException ex)
                 * {
                 *   foreach (Exception exception in ex.InnerExceptions)
                 *   {
                 *       MessageBox.Show(exception.Message);
                 *   }
                 * }
                 * });*/
        }
コード例 #10
0
 private void PreencherListaPessoasRapido()
 {
     try
     {
         IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
         List <Pessoa>         pessoasLocal       = repositorioPessoas.SelecionarTodos();
         lock (locker)
         {
             foreach (Pessoa p in pessoasLocal)
             {
                 p.Nome += " Thread 2";
                 pessoas.Add(p);
                 Thread.Sleep(100);
             }
         }
     }
     catch (Exception ex)
     {
         ExibirErro(ex);
     }
 }
コード例 #11
0
 private void PreencherListaPessoas2()
 {
     try
     {
         IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
         List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();
         lock (locker)
         {
             foreach (Pessoa p in pessoas)
             {
                 p.Nome += "Thread 2";
                 _pessoas.Add(p);
                 Thread.Sleep(100);
             }
         }
         throw new Exception("Acabou é Tetra!");
     }
     catch (Exception ex)
     {
         ExibirErro(ex);
     }
 }
コード例 #12
0
 private void PreencherListaPessoas2()
 {
     try
     {
         //teste tratamento de erro
         //throw new Exception("Teste erro!");
         lock (locker)
         {
             IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
             List <Pessoa>         pessoas            = repositorioPessoas.SelecionarTodos();
             foreach (Pessoa p in pessoas)
             {
                 p.nome += " T2";
                 _pessoas.Add(p);
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
コード例 #13
0
ファイル: FrmPessoas.cs プロジェクト: mvleandro/estudoc-
        private Task<int> PreencherDataGridView()
        {

            return Task<int>.Run(() =>
            {
                Thread.Sleep(5000);
                IRepositorio<Pessoa> repositorioPessoas = new PessoaRepositorio();

                List<Pessoa> tempPessoas = new List<Pessoa>();
                tempPessoas = repositorioPessoas.SelecionarTodos();

                Parallel.ForEach(tempPessoas, (pessoa) =>
                {
                    pessoa.Nome += " - paralelizado";
                    pessoas.Add(pessoa);
                });                

                return pessoas.Count;
            });


            /*
                Thread.Sleep(5000);

                Thread thread = new Thread(PreencherListaPessoas);
                Thread thread2 = new Thread(PreencherListaPessoas2);

                thread.Start();
                thread2.Start();
                thread.Join();
                thread2.Join();

                dgvPessoas.Invoke((MethodInvoker)delegate { dgvPessoas.DataSource = pessoas; dgvPessoas.Refresh(); });
            */



        }
コード例 #14
0
        private Task <int> PreencherDataGridView()
        {
            Thread.Sleep(2000); //Este sleep serve apenas para gerar um atraso intencional na aplicação, simulando uma tarefa mais longa

            /* A tarefa de preencher o campo desta classe com a lista de pessoas é passada para outra thread, apenas por demonstração.
             * Este método aguarda esta mesma thread finalizar utilizando o método Join().
             * O trecho de código abaixo foi comentado para dar lugar à demonstração das keywords async e await. */
            /* Thread thread = new Thread(PreencherListaPessoasLento);
             * Thread thread2 = new Thread(PreencherListaPessoasRapido);
             * thread.Start();
             * thread2.Start();
             * thread.Join();
             * thread2.Join(); */

            return(Task <int> .Run(() =>
            {
                Thread.Sleep(3000);
                IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
                pessoas = new List <Pessoa>();
                List <Pessoa> pessoasTemp = repositorioPessoas.SelecionarTodos();
                Parallel.ForEach(pessoasTemp, (pessoa) =>
                {
                    pessoa.Nome += " - Paralelizado";
                    pessoas.Add(pessoa);
                });
                return pessoas.Count;
            }));

            /* Como este método está rodando em uma thread diferente da thread que gerencia a UI, o método Invoke é chamado
             * para a referência deste objeto. Ele recebe um delegate no qual foi empregado um método anônimo que chama as
             * instruções e métodos necessários para este controle */
            //dgvPessoas.Invoke((MethodInvoker)delegate
            //{
            //    dgvPessoas.DataSource = pessoas;
            //    dgvPessoas.Refresh();
            //});
        }
コード例 #15
0
        private void Form1_Load(object sender, EventArgs e)
        {
            /* Thread
             * Thread thread = new Thread(PreencherDataGridView);
             * thread.Start();
             */

            // Sem thread
            // PreencherDataGridView

            Task minhaTask = Task.Run(() =>
            {
                IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio();
                _pessoas = repositorioPessoas.SelecionarTodos();
            });

            var awaiter = minhaTask.GetAwaiter();

            awaiter.OnCompleted(() =>
            {
                dgvPessoas.DataSource = _pessoas;
                dgvPessoas.Refresh();
            });
        }
コード例 #16
0
ファイル: MainWindow.xaml.cs プロジェクト: mvleandro/estudoc-
 private void CarregarDataGrid()
 {
     IRepositorio<Pessoa> repositorioPessoas = new PessoaRepositorio();
     List<Pessoa> pessoas = repositorioPessoas.SelecionarTodos();
     dgrPessoas.ItemsSource = pessoas;
 }
コード例 #17
0
ファイル: FrmPessoas.cs プロジェクト: mvleandro/estudoc-
        private void PreencherListaPessoas()
        {

            try
            {
                throw new Exception("Teste");
                IRepositorio<Pessoa> repositorioPessoas = new PessoaRepositorio();
                List<Pessoa> pessoas = repositorioPessoas.SelecionarTodos();

                lock (locker)
                {
                    foreach (Pessoa p in pessoas)
                    {
                        p.Nome += " Thread 1";
                        this.pessoas.Add(p);
                        Thread.Sleep(300);
                    }
                }
            }
            catch (Exception ex)
            {
                ExibirErro(ex);
            }
        }
コード例 #18
0
ファイル: FrmPessoas.cs プロジェクト: mvleandro/estudoc-
        private void PreencherListaPessoas2()
        {
            
            IRepositorio<Pessoa> repositorioPessoas = new PessoaRepositorio();
            List<Pessoa> pessoas = repositorioPessoas.SelecionarTodos();

            lock (locker)
            {
                foreach (Pessoa p in pessoas)
                {
                    p.Nome += " Thread 2";
                    this.pessoas.Add(p);
                    Thread.Sleep(100);
                }
            }

        }