Ho un modulo con 2 caselle su di esso. E voglio riempire combobox2.DataSource
sulla base di combobox1.Text
e combobox2.Text
(presumo che l'utente abbia completato l'immissione in combobox1
e si trovi nel mezzo dell'input in combobox2
). Così ho un gestore eventi per combobox2
come questo:Come arrestare correttamente BackgroundWorker
private void combobox2_TextChanged(object sender, EventArgs e)
{
if (cmbDataSourceExtractor.IsBusy)
cmbDataSourceExtractor.CancelAsync();
var filledComboboxValues = new FilledComboboxValues{ V1 = combobox1.Text,
V2 = combobox2.Text};
cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues);
}
Per quanto riguarda la costruzione DataSource è un processo che richiede tempo (si crea una richiesta al database e lo esegue) ho deciso che è meglio eseguirlo in un altro processo usando BackgroundWorker. Quindi c'è uno scenario in cui cmbDataSourceExtractor non ha completato il suo lavoro e l'utente digita un altro simbolo. In questo caso ricevo un'eccezione su questa riga
cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues);
a proposito del fatto che BackgroundWorker è occupato e non può eseguire più azioni nello stesso momento.
Come sbarazzarsi di questa eccezione?
Grazie in anticipo!
Vorrei aggiungere che CancelAsync è un'operazione non bloccante quindi, anche se gestisci CancellationPendning correttamente in DoWork(), non puoi eseguire CancelAsync per passare alla riga successiva poiché DoWork() potrebbe terminare in pochi secondi . – dzendras