Я бы сделал это немного по-другому:
private Thread workerThread;
void StartButtonClick()
{
workerThread = new Thread(ReportProgress);
thread.Start();
}
void CancelButtonClick()
{
// If you use a while(bool), it will repeat the task forever
// or with no while and just a bool, you'll have to check the value of the bool in each line
// so simply aborting it (providing you clean up) is accceptable.
workerThread.Abort();
// If you don't mind your user waiting:
// workerThread.Join(1000);
}
void ReportProgress()
{
if (InvokeRequired)
{
Invoke(ReportProgress);
return;
}
UpdateStatusBarAndStuff();
}
Лучший практический совет - "не прерывай".Это основано на том факте, что вы не знаете, в какой момент вызов прерывания выйдет из вашего кода - это может быть на полпути через создание Stream
.Таким образом, у вас есть выбор: можете ли вы гарантировать, что на любой строке кода код будет в приемлемом состоянии?
Если вы не можете, вам нужно будет использовать Thread.Join()
.
Даже с Thread.Join
пользователю может наскучить и выйти (ALT + F4) из приложения, и у вас точно такая же ситуация, как и при вызове Thread.Abort()
.