Проблема в том, что каждый раз, когда вы запускаете фоновый рабочий, вы добавляете дополнительные новые обработчики для этих двух событий. В первый раз у вас есть один обработчик для каждого. В следующий раз вы добавите еще один, так что у вас есть два. Оба называются. В следующий раз вы добавите еще один, и все три будут вызваны.
Что вы хотите сделать, это убедиться, что это происходит только один раз.
Мне нравится ваша идея поместить инициализацию обработчика событий в собственный метод, поэтому мы будем придерживаться этого.
// Your Form class is probably called something else.
public Form1()
{
InitializeComponent();
// Since backgroundWorker was created in the form designer, it will have been
// initialized in InitializeComponent(). Therefore, this has to happen after
// InitializeComponent() is called.
InitializeBackgroundWorkerHandlers();
}
private void InitializeBackgroundWorkerHandlers()
{
backgroundWorker.DoWork += (s, e) =>
{
test.RunTests();
};
backgroundWorker.RunWorkerCompleted += (s, e) =>
{
ShowCompleteMessage();
};
}
// this is called from an onclick method
private void RunAlgorithmTests()
{
backgroundWorker.RunWorkerAsync();
}