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); } }
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; })); }
private void CarregarDataGrid() { IRepositorio <Pessoa> repositorioPessoas = new PessoaRepositorio(); List <Pessoa> listaPessoas = repositorioPessoas.SelecionarTodos(); dgrPessoas.ItemsSource = listaPessoas; }
private Task <int> PreencherDataGridView() { return(Task <int> .Run(() => { Thread.Sleep(5000); IRepositorio <Pessoa> repositorio = new PessoaRepositorio(); _pessoas = repositorio.SelecionarTodos(); return _pessoas.Count; })); }
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); } } }
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(); }); }); }
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); } } }
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); } } }
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); * } * } * });*/ }
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); } }
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); } }
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); } }
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(); }); */ }
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(); //}); }
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(); }); }
private void CarregarDataGrid() { IRepositorio<Pessoa> repositorioPessoas = new PessoaRepositorio(); List<Pessoa> pessoas = repositorioPessoas.SelecionarTodos(); dgrPessoas.ItemsSource = pessoas; }
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); } }
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); } } }