我正在尝试调试在某台特定计算机上一直崩溃的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。但我还是想弄清楚这一点。