none
Problema com thread e backgroundworker RRS feed

  • Pergunta

  • Pessoal estou com um problema de implementação de threads com backgroundworker...

    na verdade estou implementando uma progressbar que executaria enquanto uma rotina estaria sendo implementada no banco...

    o problema é que realmente sou novato em threads delegates e backgroundworker, iniciei um estudo de tecnologia a apenas alguns dias e começei implementar a rotina apenas hoje, 

    no evento DoWork do backgroundworker eu chamo duas threads, uma que inicia a progressbar e outra que inicia o acesso ao banco por exemplo(fora a thread do próprio form para que neste não ocorra deadlock)

    para fins de teste no meu método inserts fiz ele incluir numa tabela produtos, 50000 registros e logo em seguida preencher um datagridview...

    no fim ele da um abort nas threads... o porém é que acima de 10000(estranhamente abaixo ele da certo o.O) registros ele trava o form do windows como se estivesse usando a thread do mesmo, que não é o caso... preciso que ele mostre a progress bar até que o grid seja preenchido sem travar o form

    namespace ThreadSampleWinForm
    {
        public partial class Form1 : Form
        {
            #region Atributos

            private readonly string _conexao;
            private DataSet _ds;
            private Thread _trBanco;
            private Thread _trBarra;
            private Barra _br;
            private bool _processoFinalizado;
            
            #endregion

            #region Construtor

            public Form1()
            {
                InitializeComponent();
                _conexao = "Data Source=.\\SQLEXPRESS;AttachDbFilename=" + Environment.CurrentDirectory + "\\Nethos.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            }

            #endregion

            #region Métodos

            private void ControleTransaction()
            {
                var conn = new SqlConnection(_conexao);
                SqlTransaction transaction = null;
                for (int i = 0; i < int.Parse(mskQuantidade.Text); i++)
                {
                    #region Select

                    string selectProduto =
                        //"INSERT INTO Paises (Id,CodigoInternacional,Descricao) VALUES (" + i + 2 + ",1789" + i +",'Teste" + i + "')"
                        "insert into PisCofins values(" + i + ",'descrição" + i + "',2,2,'POSITIVA');" +
                        "insert into ProdutosNCM values(" + i + "," + i + ",'descrição" + i +"','123" + i + "',2);" +
                        "insert into Produtos values(" + i + "," + i + ",1,'descrição" + i +"','Mercadoria_Para_Revenda');" +
                        "insert into ProdutosGrupos values(" + i + ",'descrição" + i + "');" +
                        "insert into ProdutosClassificacoes values(" + i + "," + i + ",'descrição" +i + "');" +
                        "insert into ProdutosCategorias values(" + i + ",'descrição" + i + "');" +
                        "insert into ProdutosApresentacoes values(" + i + ",'descrição" + i + "');" +
                        "insert into ProdutosFuncoesTerapeuticas values(" + i + ",'função" + i + "');" +
                        "insert into AcoesTerapeuticas values(" + i + ",'descrição" + i + "');" +
                        "insert into FormasCompras values(" + i + ",'a vista" + i + "');" +
                        "insert into Pessoas values(" + i +",1,'teste','teste','Fisica','','','','29-06-2012')" +
                        "insert into Fabricantes values(" + i + ",'contato',1);" +
                        "insert into ProdutosPrioridadesVendas values(" + i + ",'descrição" + i + "'," +i + "," + i + ");" +
                        "insert into ProdutosComerciais values(" + i + "," + i + "," + i + "," +i + "," + i + "," + i + "," + i + "," + i + "," + i +",'caracteristica','G',1,1,1,CURRENT_TIMESTAMP,1,1,2,'1230',1,CURRENT_TIMESTAMP,1,'Geral',1,1,1);";

                    #endregion

                    try
                    {
                        if (conn.State == ConnectionState.Closed)
                        {
                            conn.Open();
                            transaction = conn.BeginTransaction();
                        }
                        if (transaction != null)
                        {
                            var cmd = new SqlCommand(selectProduto, transaction.Connection) { Transaction = transaction };
                            cmd.ExecuteNonQuery();
                        }
                    }

                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        if (transaction != null)
                            transaction.Rollback();
                        break;
                    }
                }
                if (conn.State == ConnectionState.Open)
                {
                    try
                    {
                        if (transaction != null) transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        if (transaction != null)
                            transaction.Rollback();
                    }
                    conn.Close();
                }
                
            }

            private void Inserts()
            {
                if (InvokeRequired)
                    BeginInvoke(new MethodInvoker(Inserts));
                else
                {
                    ControleTransaction(); 
                    PreencherDataGridView();
                    if (_processoFinalizado)
                    {
                        _trBanco.Abort();
                        _trBarra.Abort();
                    }
                }

            }

            private void PreencherDataGridView()
            {
                if (InvokeRequired)
                    BeginInvoke(new MethodInvoker(PreencherDataGridView));
                else
                {
                    var conn = new SqlConnection(_conexao);
                    conn.Open();
                    var da = new SqlDataAdapter("SELECT * FROM ProdutosComerciais", conn);
                    _ds = new DataSet();
                    da.Fill(_ds);
                    dataGridView1.DataSource = _ds.Tables[0];
                    dataGridView1.Refresh();
                    _processoFinalizado = true;
                }
            }

            private void ExecutaExclusoes()
            {
                var conn = new SqlConnection(_conexao);

                #region Delete
                var cmd =
                   new SqlCommand(
                        "delete from RecVendasConvMovCentCust;" +
                        "delete from FormasRecVendasConvenios;" +
                        "delete from RecVendasConvMovPlanCont;" +
                        "delete from RecVendasConvMovBancarias;" +
                        "delete from RecVendasConvenios;" +
                        "delete from RecVendasPrazoMovCentCust;" +
                        "delete from FormasRecVendasPrazo;" +
                        "delete from RecVendasPrazoMovPlanCont;" +
                        "delete from RecVendasPrazoMovBancarias;" +
                        "delete from RecVendasPrazo;" +
                        "delete from VendasPrazo;" +
                        "delete from VendasConvenios;" +
                        "delete from VendasPbm;" +
                        "delete from CuponsFiscaisCab;" +
                        "delete from ItensCuponsFiscais;" +
                        "delete from MovimentacoesDocECF;" +
                        "delete from Convenios;" +
                        "delete from MovimentacoesCaixas;" +
                        "delete from EmissoresCuponsFiscais;" +
                        "delete from ModalidadesVendas;" +
                        "delete from ParametrosVendas;" +
                        "delete from Pbms;" +
                        "delete from ProdutosComerciais;" +
                        "delete from MovimentacoesEstoques;" +
                        "delete from MovimentacoesEstoques;" +
                        "delete from ProdutosComerciais;" +
                        "delete from Produtos;" +
                        "delete from ProdutosNCM;" +
                        "delete from PisCofins;" +
                        "delete from ProdutosClassificacoes;" +
                        "delete from ProdutosGrupos;" +
                        "delete from ProdutosCategorias;" +
                        "delete from ProdutosApresentacoes;" +
                        "delete from ProdutosFuncoesTerapeuticas;" +
                        "delete from AcoesTerapeuticas;" +
                        "delete from FormasCompras;" +
                        "delete from Fabricantes;" +
                        "delete from PessoasJuridicas;" +
                        "delete from Contadores;" +
                        "delete from PessoasDocumentos;" +
                        "delete from PessoasEnderecos;" +
                        "delete from PessoasTelefones;" +
                        "delete from PessoasFisicas;" +
                        "delete from PessoasIdentificacoes;" +
                        "delete from PermissoesColaboradores;" +
                        "delete from CurvasCompras;" +
                        "delete from Configuracoes;" +
                        "delete from Terminais;" +
                        "delete from PeriodosFiscais;" +
                        "delete from PontosEstoques;" +
                        "delete from UnidadesNegocio;" +
                        "delete from colaboradores;" +
                        "delete from pessoas;" +
                        "delete from ProdutosPrioridadesVendas;", conn);

                #endregion

                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                finally
                {
                    conn.Close();
                }
            }

            #endregion

            #region Eventos

            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                ExecutaExclusoes();
            }

            private void btnInclusões_Click(object sender, EventArgs e)
            {
                if (mskQuantidade.Text != string.Empty)
                    backgroundWorker1.RunWorkerAsync();
            }

            private void btnExclusões_Click(object sender, EventArgs e)
            {
                ExecutaExclusoes();
                dataGridView1.DataSource = null;
                dataGridView1.Refresh();
                MessageBox.Show("Excluídos");
            }

            private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                _br = new Barra();

                _trBarra = new Thread(_br.AtualizaBarra);
                _trBarra.Start();

                _trBanco = new Thread(Inserts);
                _trBanco.Start();
            }

            #endregion
        }
    }


    Desculpa postar todo código, realmente não sei o problema... ou melhor, não sei a solução.

    segunda-feira, 2 de julho de 2012 20:35

Respostas

  • Tente usar Application.DoEvents para que a thread principal, tenha tempo de atualizar o formulario.

    Outra coisa, em vez de toda vez buscar todos os dados, pq não busca apenas os dados novos e adiciona no grid.

    • Marcado como Resposta M a i c o n terça-feira, 3 de julho de 2012 10:53
    segunda-feira, 2 de julho de 2012 21:07

Todas as Respostas

  • Tente usar Application.DoEvents para que a thread principal, tenha tempo de atualizar o formulario.

    Outra coisa, em vez de toda vez buscar todos os dados, pq não busca apenas os dados novos e adiciona no grid.

    • Marcado como Resposta M a i c o n terça-feira, 3 de julho de 2012 10:53
    segunda-feira, 2 de julho de 2012 21:07
  • vou tentar usar isso mesmo...

    e sobre os dados, a intenção é justamente fazer ele salvar muitos dados e buscar muitos dados... é apenas um teste pra verificar se não vai travar o form que é o caso.....

    valeu!

    terça-feira, 3 de julho de 2012 10:55