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 Task 中出错。

最终,我只是想弄清楚如何处理错误。 任何指导都会有很大帮助。 谢谢!

立即发现一个错误:

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; });   

最新更新