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

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top