Я пытаюсь отладить приложение WPF, которое постоянно вылетает на одной конкретной машине. Мы никогда не сталкивались с авариями в наших тестах, но мы обеспокоены тем, что это может произойти и с заказчиками.
Сбой происходит во время работы BackgroundWorker.
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += BackgroundWorker_DoWork;
_backgroundWorker.WorkerSupportsCancellation = true;
_backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
_backgroundWorker.RunWorkerAsync(argument);
Я бы знал, возникло ли исключение, потому что обработчик события RunWorkerCompleted регистрировал бы исключение в файле журнала.
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Logger.LogMessage(e.Error.ToString());
}
}
Я приблизительно знаю, где в обработчике DoWork происходит сбой, потому что он находится в середине набора файловых операций, и я могу видеть, какие файлы уже были перемещены после запуска приложения. Моей первой мыслью было, что это обычная ошибка файловой операции, например проблема с правами доступа, но все мои тесты показывают, что будет выдано исключение, и я смогу его увидеть. Я также проверил, есть ли блок try / catch, который может перехватывать исключение, и нет.
Кажется, что сбой в какой-то момент во время выполнения этого цикла:
if (Directory.Exists(sourceDirectory))
{
var relativeFiles = HelperService.GetRelativeFiles(sourceDirectory);
foreach (string relativeFile in relativeFiles)
{
string destPath = Path.Combine(basePath, relativeFile);
string sourcePath = Path.Combine(sourceDirectory, relativeFile);
HelperService.MoveAndOverwriteFile(sourcePath, destPath);
}
}
А вот HelperService.MoveAndOverwriteFile:
public static void MoveAndOverwriteFile(string sourcePath, string destPath)
{
Directory.CreateDirectory(Path.GetDirectoryName(destPath));
File.Delete(destPath);
File.Move(sourcePath, destPath);
}
Я подумал, что, может быть, что-то отменяет BackgroundWorker, но я понимаю, что метод CancelAsync () не прерывает поток, а устанавливает свойство CancellationPending, то есть CancelAsync () ничего не делает, если обработчик DoWork не предназначен для ответа на него. Есть ли какая-либо функциональность .NET, которая могла бы отменить или прервать BackgroundWorker без моего ведома об этом?
Также как будто что-то заставляет приложение закрываться, но я не нашел ничего, что могло бы это сделать. Может ли быть какая-то ошибка .NET, которая настолько радикальна, что прерывает все приложение, а не вызывает исключение? Я проверил Windows Event Viewer, и с этим не связано никаких ошибок.
Должен ли я подозревать аппаратный сбой, возможно?
Я знаю, что BackgroundWorker больше не используется, но я унаследовал некоторый старый код, который использует множество BackgroundWorkers. Я, вероятно, буду использовать async / await в будущих версиях. Но я все еще хочу выяснить это.