Ответ 1
"Тема прерывается". Ошибки - 99% времени, вызванные использованием Thread.Abort() из вашего кода, чтобы закончить процесс в любых других обстоятельствах, кроме катастрофического сбоя. Thread.Abort - это зло, потому что он вводит исключение в поток из-за пределов своего собственного исполняемого кода, и поэтому чрезвычайно сложно и даже невозможно ожидать и грациозно обрабатывать его.
Если вы используете этот код в другом потоке (хороший выбор BTW, операции с БД являются естественным кандидатом для многопоточности), НЕ используйте Thread.Abort(), чтобы попытаться контролировать поток. Вместо этого вы должны создать код потока, который будет реагировать на некоторые внешние изменения, которые вы можете вызвать, что приведет к его изящному завершению обработки. Вот простой пример:
public class Foo
{
public void MainMethod()
{
bool cancel = false; //our external flag
//our worker thread, which is being given a callback method to poll at "safe" times.
var workerThread = new Thread(()=>AsyncMethod(()=>cancel));
//start the thread
workerThread.Start();
//do some other work that takes less time than the thread
Thread.Sleep(200)
//async thread is still going; cancel execution and wait for graceful exit.
cancel = true;
workerThread.Join();
}
public void AsyncMethod(Func<bool> wasCancelled)
{
//Do some repetitive task that takes longer than we're willing to wait
for(var i=1; i<2000; i++)
{
if(wasCancelled()) break; //generally a "safe" place to check
Thread.Sleep(50); //stand-in for some atomic operation that should not be interrupted.
}
if(wasCancelled())
Debug.WriteLine("Thread cancelled");
else
Debug.WriteLine("Thread completed");
}
}
В этом примере используется лямбда с "внешним закрытием"; если наш метод должен был выйти до завершения рабочего потока, лямбда выйдет из строя, потому что отмененная переменная была удалена и уничтожена. Просто помните об этих вещах при адаптации этой модели к вашей реальной архитектуре; если вы начинаете поток в одном методе и ожидаете его завершения в другом, а при третьем отключении (довольно распространенное обстоятельство) флаг должен жить где-то там, где он не будет уничтожен до того, как рабочий поток будет завершенное выполнение.