A possible solution is to use async-await (in .NET Framework above 4.5).
I created this quick example in .NET Framework 4.6.1
In this case, the winform does not freeze when waiting for "Say Hello" after button click, and you can move the GUI freely when it waits. Perhaps this async-await pattern is suitable in your case. I suggest to try it,
BR
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
await Task.Delay(15000);
MessageBox.Show("Say Hello");
}
}
}