BackgroundWorker dando problema em C #, enquanto a adição item na caixa de listagem?
-
06-07-2019 - |
Pergunta
Eu tenho uma caixa de listagem em que eu tenho para dar mínimo 2 arquivos para a fusão. a fusão é feito quando eu clique em mala button.The barra de progresso começa e o aparece caixa de mensagem que os arquivos tem sido merged.i estou usando trabalho de fundo para executar a barra do progresso.
Agora, o problema é quando a fusão é feita com 2 arquivos, eu adicionar mais um arquivo, clique no botão Mesclar mescla é feita mensagem aparece i clique em OK na caixa de mensagem, novamente as aparece caixa de mensagem com a mesma mensagem de que a fusão tem sido caixa de mensagem done.This continua aparecendo o número de vezes que eu adicionar o arquivo na caixa de listagem.
Por exemplo, para 2 arquivos mensagem aparece 1CE den sobre a adição de mais 1 mensagem de arquivo aparece 2ice, mais 1 arquivo na mensagem de caixa de listagem aparece 3ic.Like dis continua ....
Quando usei o depurador para segui-lo, notei que o meu fundo evento Trabalhador Runcompleted é chamado esse número de vezes sempre que eu adicionar arquivo no listbox.Here é o código para o botão Mesclar evento Click ...
Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
Worker.WorkerSupportsCancellation = true;
if (!Worker.IsBusy)
Worker.RunWorkerAsync();
else
MessageBox.Show("Cannot run background worker twice ");
if (Worker.IsBusy)
{
progress = new ProgressDialogDTB();
progress.FormClosing +=
new FormClosingEventHandler(ProgressDialog_FormClosing);
progress.ShowDialog(this);
}
while (Worker.IsBusy)
{
Application.DoEvents();
}
//For Background Worker completed Event...
private void Worker_RunWorkerCompleted(object sender,
AsyncCompletedEventArgs e)
{
if (progress != null)
{
progress.Close();
progress = null;
}
if ( e.Cancelled )
MessageBox.Show(" Progress was cancelled ");
if (e.Error == null)
if (!e.Cancelled)
MessageBox.Show("Files has been merged ");
if (e.Error != null)
MessageBox.Show(e.Error.Message);
}//Worker_RunWorkerCompleted
Eu não sei onde eu estou recebendo errado. Por favor, ajuda ... Obrigado ...
Solução
Eu estou supondo que em cada botão Mesclar clique você está registrando um novo delegado. Se o seguinte código:
Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
está no manipulador de eventos clique do botão Mesclar considerar movê-lo para o seu método de forma initailization. Você só precisa registrar um delegado uma vez. Da próxima vez que você fizer isso acrescenta um novo modo on segunda Mesclar clique ele será executado duas vezes, em terceiro clique três vezes e assim por diante.
Outras dicas
Se o seu trabalho é uma variável nível de módulo e você está anexando à sua lista de invocação a cada vez que o botão cliques em seguida, esse método será chamado cada vez.
Digamos que você clique 3 vezes, então este Worker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
código será executado 3 vezes e será chamado 3 vezes.
Defina o manipulador Concluído uma vez quando você instanciar o objeto de trabalho.
Bah! Batido a ele!