Domanda

Ho una casella di riepilogo in cui devo fornire almeno 2 file per la fusione. l'unione avviene quando faccio clic sul pulsante Unisci. Viene avviata la barra di avanzamento e viene visualizzata la finestra di messaggio Che i file sono stati uniti. Sto usando un lavoratore in background per eseguire la barra di avanzamento.

Ora il problema è quando l'unione è fatta con 2 file, aggiungo un altro file, faccio clic sul pulsante Unisci l'unione è fatta appare il messaggio faccio clic su OK sulla finestra del messaggio, di nuovo la finestra di messaggio appare con lo stesso messaggio che l'unione ha fatto. Questa finestra di messaggio continua ad apparire il numero di volte in cui aggiungo il file nella casella di riepilogo.

Ad esempio, per 2 file appare un messaggio 1ce den quando si aggiunge un altro messaggio di file appare 2ice, 1 altro file nel messaggio della lista appare 3ic. Come continua ...

Quando ho usato il debugger per rintracciarlo, ho notato che il mio evento Completato Runwork in background viene chiamato quel numero di volte ogni volta che aggiungo un file nella lista. Ecco il codice per il pulsante Unisci Evento clic ...

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

Non so dove sbaglio. Per favore, aiuta ... Grazie ...

È stato utile?

Soluzione

Suppongo che su ogni pulsante Unisci stai registrando un nuovo delegato. Se il seguente codice:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

si trova nel gestore di eventi click del pulsante Unisci, considera l'idea di spostarlo nel metodo di initailizzazione del modulo. Devi solo registrare un delegato una volta. La prossima volta che ne aggiungi uno nuovo, quindi al secondo clic Unisci verrà eseguito due volte, al terzo clic tre volte e così via.

Altri suggerimenti

Se il tuo lavoratore è una variabile a livello di modulo e stai aggiungendo al suo elenco di invocazioni ogni volta che il pulsante fa clic, quel metodo verrà invocato ogni volta. Di 'che fai clic 3 volte, quindi questo codice Worker.RunWorkerCompleted + =     new RunWorkerCompletedEventHandler (Worker_RunWorkerCompleted); verrà eseguito 3 volte e verrà richiamato 3 volte. Impostare il gestore Completato una volta quando si crea un'istanza dell'oggetto worker.

Bah! Picchiato!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top