Usuário com melhor resposta
Problema com thread e backgroundworker

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.
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
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
-