Что может привести к сбою BackgroundWorker без исключения? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь отладить приложение 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 в будущих версиях. Но я все еще хочу выяснить это.

...