Причина этого в том, что события в .NET являются многоадресными.
Возьмите событие нажатия кнопки, каждый раз, когда вы выполняете этот кусок кода:
button1.Click += ...
вы добавляете другой обработчик события к этому событию клика.
Таким образом, когда вы в первый раз выполните приведенный выше код, а затем нажмете кнопку, ваш обработчик событий будет вызван один раз.
Затем, если вы снова вызовете указанный выше код , а затем нажмете кнопку, ваш обработчик событий будет вызван дважды. Затем три раза, четыре раза и т. Д.
Так что, если вы намереваетесь повторно использовать объект BackgroundWorker, не выполняйте код, который добавляет эти два обработчика событий более одного раза, и у вас все будет хорошо.
В идеале я бы прикрепил обработчики событий одновременно с созданием объекта BackgroundWorker, а затем вызывал бы только .RunWorkerAsync
по нажатию кнопки. Однако, как упоминает Джон, вам следует подумать о том, следует ли вам вообще использовать повторно. Если вы нажмете кнопку и попытаетесь запустить работника, когда он уже запущен, вы получите исключения.