Ваш код HeavyMethod()
должен иметь доступ к некоторой, скажем, логической переменной, которая должна указывать на необходимость немедленного возврата. Как часто вы будете проверять значение этой переменной внутри кода HeavyMethod()
, будет зависеть время задержки между моментом нажатия кнопки «Отмена» и фактическим прекращением действия.
bool cancelValidationRequest = false;
private void buttonCancelValidation_Click(object sender, EventArgs e)
{
cancelValidationRequest = true; // this will cause HeavyMethod return asap
backgroundWorker.CancelAsync(); // this makes requet to thread to stop, but it still in HeavyMethod...
}
и внутри HeavyMethod()
private void HeavyMethod()
{
//execute heavy code
if(cancelValidationRequest ) return;
// continue execute heavy code
if(cancelValidationRequest ) return;
.....
....
}
Как-то так, просто чтобы дать идею.
EDIT
Как указал Визетукс, вы должны обратить внимание на тот факт, что булево значение (в данном конкретном случае) манипулируется разными потоками.
Надеюсь, это поможет.