什么可能导致BackgroundWorker失败而不抛出异常?

时间:2018-05-09 16:36:53

标签: c# exception error-handling backgroundworker cancellation

我正在尝试调试在某台特定计算机上一直崩溃的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属性,这意味着除非DoWork处理程序被设计为响应,否则CancelAsync()不会做任何事情。它。在我不知情的情况下,是否有任何.NET功能可以取消或中止BackgroundWorker?

它似乎也在迫使应用程序关闭,但我还没有找到任何可以做到的事情。是否有一些.NET错误如此激烈以至于它会中止整个应用程序而不是抛出异常?我检查了Windows事件查看器,并没有任何与此相关的错误。

我是否应该怀疑硬件故障?

我知道BackgroundWorker不再使用了,但我继承了一些使用大量BackgroundWorkers的旧代码。我可能会在将来的版本中使用async / await。但我还是想弄清楚这一点。

0 个答案:

没有答案