首页 > 解决方案 > 什么会导致 BackgroundWorker 在不抛出异常的情况下失败?

问题描述

我正在尝试调试在一台特定机器上始终崩溃的 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 事件查看器,没有任何与此相关的错误。

我应该怀疑硬件故障吗?

我知道 BackgroundWorker 并没有真正被使用,但我继承了一些使用大量 BackgroundWorker 的旧代码。我可能会在未来的版本中使用 async/await。但我仍然想弄清楚这一点。

标签: c#exceptionerror-handlingbackgroundworkercancellation

解决方案


推荐阅读