Вы присоединяете поток _worker к текущему потоку (поток пользовательского интерфейса). это причина, почему пользовательский интерфейс зависает.
Если вы хотите, чтобы _работник завершил работу до закрытия приложения, я хотел бы предложить следующую идею.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Check worker thread complete or not
if (_worker.ThreadState != ThreadState.Stopped)
{
e.Cancel = true;
MessageBox.Show("Not complete, please wait");
}
}
Я надеюсь, что это сработает для вас.