c# - 什么会导致 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。但我仍然想弄清楚这一点。
解决方案
推荐阅读
- powershell - Powershel 从毫秒转换为时间格式
- python - 如何重新组织这些数据?
- javascript - 为什么我的 javascript 页面无法链接到我的 HTML 页面?
- mongodb - 通过 localhost 连接到容器:Docker vs Kubernetes
- go - 从函数中同时返回值和错误是惯例吗
- sql - teiid sql 只加入一行
- azure - Azure VM GPU 加速映像
- php - 如何跟踪来自 php echo 表单的响应
- javascript - 在数组的映射中运行 setInterval 函数
- javascript - 定时器运行太快