Многопоточность | Тема была прервана - PullRequest
1 голос
/ 28 февраля 2020

Мы выполняем длинную работу (функцию) в 3-4 разных потоках. Все запущенные потоки были успешно завершены, но иногда одно из потоков выбрасывает исключение Thread was being aborted, что приводит к остановке всех потоков. Ниже приведен пример кода для того, что мы фактически делаем в нашем приложении.

List<Thread> lstThreads = new List<Thread>();
foreach(int 0; i < 4; i++)
{
  Thread th = new Thread(() => {
    RunLongRunningJob(i);
  });
  lstThreads.Add(th);
}
foreach (Thread th in lstThreads)
  th.Start();

Мы вызываем остальные API, записываем файлы и обновляем записи базы данных в RunLongRunningJob.

PS Мы не использует замки, это может быть причиной?

1 Ответ

3 голосов
/ 28 февраля 2020

В C# потоки не могут быть остановлены вообще без побочных эффектов. Представьте себе, что в нити есть одноразовые предметы, готовые и - просто останавливается. В качестве обходного пути, когда поток прерывается (что вы - не следует, но вы можете вызвать объект Thread), генерируется и выполняется исключение ThreadAbortException. Это позволяет обработке исключений включать и закрывать дескрипторы файлов и т. Д. c.

Ах, наконец-то нашёл это - это сообщение в блоге, объясняющее, почему ВЫ никогда не должны вызывать Thread.Abort (то есть он не должен вызываться код приложения):

http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation

Речь идет о синхронизации, и поток на самом деле не выполняется окончательно должным образом в действительно плохих случаях.

Теперь, ЧТО-ТО должно выяснить, что вызывает прерывание потока. Это то, что нужно проверить - помогут детали исключения, включая трассировку стека и возможное внутреннее исключение в нем.

...