c# - WPF 异步任务错误未触发
问题描述
也许我在这里完全迷失了,但我很难弄清楚是什么导致我的任务过早退出,并且到目前为止任何错误处理尝试都失败了。问题是我正在遍历文件系统中的数百个目录,因此不可能通过单步调试来找到我失败的地方,而且无论如何我都需要处理错误。这是我到目前为止所拥有的。
由 WPF 按钮触发的按钮代码。
private void BtnCopy_Click(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false; BtnCopy.IsEnabled = false; });
var task = Task.Run(() =>
{
try
{
_ = RunCopy();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
});
}
task.ContinueWith((t) => { Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = true; BtnCopy.IsEnabled = true; }); });
此消息框永远不会显示。在我的 RunCopy 代码中,我正在循环浏览目录中的文件夹。
private async Task RunCopy()
{
foreach (var folder in firstDirInfo.GetDirectories())
{
if (folder.Name.Contains(customerNumber))
{
await CopyTask(firstDirInfo + @"\" + folder, customerNumber);
}
}
}
CopyTask 是最终出错的事件。
private async Task CopyTask(string directory, string customerNumber)
{
var dirInfo = new DirectoryInfo(directory);
//Create root folder
var createFolder = copyToDir + @"\" + dirInfo.Name;
if (!Directory.Exists(createFolder))
Directory.CreateDirectory(createFolder);
foreach (var folder in dirInfo.GetDirectories())
{
var sourceFolder = directory + @"\" + folder.Name;
var targetFolder = createFolder + @"\" + folder.Name;
//Create target path if it doesn't exist
if (!Directory.Exists(targetFolder))
Directory.CreateDirectory(targetFolder);
//Now Create all of the directories
foreach (var dirPath in Directory.GetDirectories(sourceFolder, "*", SearchOption.AllDirectories))
{
if (!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
}
//Gather copy information
foreach (var newPath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))
{
masterDic.Add(newPath, newPath.Replace(sourceFolder, targetFolder));
}
}
}
如果这样做的目的是最终运行异步文件副本,我只是先收集文件信息并创建目录,以便稍后处理进度条。它在名称不佳的 CopyTask 任务中出错。
最终我只是想弄清楚如何处理错误。任何指导都会有很大帮助。谢谢!
解决方案
立即发现一个错误:
try
{
_ = RunCopy();
}
必须等待,否则 Try 块无法捕获任务中的任何异常。并且 BtnCopy_Click 必须变为异步的。
private async void BtnCopy_Click(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false; BtnCopy.IsEnabled = false; });
try
{
await RunCopy();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = true; BtnCopy.IsEnabled = true; });
推荐阅读
- c# - 如何防止“考虑应用'await'运算符...”某些功能的警告?
- laravel-5.6 - Laravel mix - 版本控制不起作用
- mongodb - $project 拆分字符串并过滤空值
- javascript - 为什么 Select2 在 iOS 设备上不能正常工作?
- c - 从 C 中的输入动态读取字符串
- ios - MacOS 上的 Spotify 身份验证
- sql - 多租户设计 - 在模式之间共享数据
- kubernetes - Kubernetes 节点自动缩放和对每个节点的 pod 的精细控制
- awk - awk 选择列的一部分(3 个字符中的第 3 个)
- haskell - Haskell - 如何嵌套包含多个 putStrLn satatements 的多个 if 语句