Этот бит выглядит так, как будто использует элементы управления пользовательского интерфейса из неправильного потока:
ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1);
Я предлагаю вам записать имя пользователя и пароль в локальные строковые переменные над кодом, который добавляет обработчик событий - вы можете использовать эти захваченные переменные в своем делегате. Таким образом, все должно быть в правильном потоке:
backgroundWorker12 = new BackgroundWorker();
timer1.Enabled = true;
string user = txtUserID.Text.Trim();
string password = txtPassword.Password.Trim();
backgroundWorker12.DoWork += (s, args) =>
{
// ... same code as before up to here
ValidateLogin2(user, password, -1);
worker2.ReportProgress((int)percentageDone);
};